Объяснение к уроку
После этого урока ты сможешь:
Реальные ответы API и конфигурации часто объединяют различные коллекции: словарь может содержать список сервисов, а каждый сервис сам может быть словарем. Читай вложенный путь по одному уровню за раз. config["services"] выбирает список; [0] выбирает запись; ["name"] выбирает поле.
Вложенные коллекции изменяемы. Изменение вложенного поля по его пути меняет исходную коллекцию. Тип внешней коллекции не отменяет изменяемости объектов внутри нее.
Когда вложенное отображение необязательно, используй .get(key, {}), чтобы получить пустой словарь в качестве резервного значения. Читай необязательное числовое значение с помощью .get(key, default), а не через проверку истинности: значение 0 может быть вполне осознанным.
config = {"targets": [{"name": "staging", "port": 8081}, {"name": "prod", "port": 443}]}
print(config["targets"][1]["port"])Вывод:
443Первый поиск возвращает список; второй выбирает словарь внутри него.
limits = {"search": {"retries": 2, "timeout": 30}}
limits["search"]["retries"] += 1
print(limits["search"]["retries"])
print(limits["search"]["timeout"])Вывод:
3
30Изменяется только настройка повторных попыток.
jobs = [{"name": "index", "done": True}, {"name": "backup", "done": False}]
for job in jobs:
if job["done"]:
print(f"Finished: {job['name']}")Вывод:
Finished: indexПеременная цикла уже представляет собой отдельный словарь; числовой индекс не требуется.
settings = {"thresholds": {"api": 0}}
thresholds = settings.get("thresholds", {})
print(thresholds.get("api", 10))
print(thresholds.get("worker", 10))Вывод:
0
10Сохраненный ноль сохраняется, а для отсутствующего ключа используется резервное значение.
| Цель | Пример |
|---|---|
| Прочитать вложенное поле | data["jobs"][0]["status"] |
| Обновить вложенное поле | data["limits"]["api"] = 5 |
| Перебрать записи | for record in records: |
| Прочитать необязательный вложенный словарь | data.get("limits", {}) |
| Сохранить записанный ноль | limits.get("api", 10) |
for record in records не является числовым индексом.data["missing"] вызывает KeyError, если ключ отсутствует.dict.get("key") or default ошибочно заменяет допустимые ложные значения, такие как 0.