Как избегать исключений KeyError

Распространённая ошибка при использовании словарей — доступ к несуществующему ключу. Это обычно приводит к исключению KeyError:

mydict = {}
mydict['not there']

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'not there'



Один из способов избежать KeyError — использовать метод dict.get, который позволяет вам указать значение по умолчанию, которое будет возвращать в случае отсутствия ключа.

value = mydict.get(key, default_value)



Возвращает mydict[key], если он существует, но в противном случае возвращает default_value. Обратите внимание, что это не добавляет key к mydict. Поэтому, если вы хотите сохранить эту пару ключ-значение, вы должны использовать mydict.setdefault(key, default_value), который хранит пару ключ-значение.

mydict = {}
print(mydict)
# {}
print(mydict.get("foo", "bar"))
# bar
print(mydict)
# {}
print(mydict.setdefault("foo", "bar"))
# bar
print(mydict)
# {'foo': 'bar'}



Другой способ избавиться от ошибки — перехватить исключение

try:
value = mydict[key]
except KeyError:
value = default_value



Вы также можете проверить, есть ли ключ словаре:

if key in mydict:
value = mydict[key]
else:
value = default_value



Обратите внимание, что в многопоточных средах ключ может быть удален из словаря после проверки, создавая состояние, при котором всё ещё может быть выдано исключение.



В качестве другого вариант можно использовать подкласс dict collection.defaultdict, который имеет значение default_factory для создания новых записей в dict при получении new_key.