При разборе вложенных структур из словарей и списков (например, конфигов), удобно пользоваться блоком 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'
Независимо от того, не найден ли будет какой-то ключ словаря или индекс списка – будет поймана одна и та же ошибка LookupError
.
Альтернативно, вы можете сразу обновлять записи словаря (если они не найдены) методом 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
Также, вам будет интересно почитать про defaultdict, который вам создает в себе записи при доступе к ним.
Красивого всем кода!
Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈