Найти тему
106 подписчиков

При разборе вложенных структур из словарей и списков (например, конфигов), удобно пользоваться блоком try-except.


Ловим IndexError, если индекс отсутствует в списке, и KeyError, если ключ отсутствует в словаре. Однако, лучше ловить LookupError, который является предком обоих исключений:

>>> issubclass(KeyError, LookupError)

True

>>> issubclass(IndexError, LookupError)

True

Пример:

config = {}

try:

admin = config['db'][0]['admins']['list'][0]

except LookupError:

admin = 'all'

Альтернативно, вы можете сразу обновлять записи словаря (если они не найдены) методом dict.setdefault(key, default). Этот метод проверяет, есть ли ключ в словаре, если его нет, то в словарь добавляется значение по умолчанию, и оно же возвращается. А если ключ был в словаре, то вернется значение по этому ключу. Поэтому такой неуклюжий код:

if 'workers' not in config:

config['workers'] = 8

workers = config['workers']

Может быть переписан как:

workers = config.setdefault('workers', 8)

Заметьте, что повторный вызов с другим default не поменяет уже записанное в первый раз значение:

>>> d = {}

>>> d.setdefault('foo', 10)

10

>>> d.setdefault('foo', 20)

10

Красивого всем кода!
Около минуты