January 18

Как безопасно работать со словарями в Python и избежать KeyError

Словарь (или dict) в Python, одна из базовых и очень часто используемых структур, с которой мы обычно взаимодействуем также часто, как и с любимой кружечкой, из которой пьем кофе по утрам. :)

Мы используем их повсеместно: для работы с данными из API, хранения конфигураций и многого другого. Однако работа с отсутствующими ключами в словаре неожиданно может привести к исключению KeyError. В этой статье разберём, как безопасно извлекать значения из словаря, чтобы избежать подобных ошибок.

Обычно мы получаем значение по ключу через квадратные скобки, например так:

my_dict = {"key_1": "value_1", "key_2": "value_2"}
print(my_dict["key_1"])

>>> value_1

Вопросов к этому способу нет, все работает как часы и мы всегда получаем ровно то что нам нужно.

Но что, если мы работаем с словарями, полученными из внешних источников, например, http запросов, и какое либо поле является опциональным, а нам в коде надо в зависимости от этого прописать какое-то условие? Мы можем поступить ровно также, используя квадратные скобки для сравнения значений:

if new_dict["key"] == "value":
    print("ok!")
else:
    print("no!")

И это будет работать ровно до того момента, пока эта пара ключ-значение есть внутри словаря. Если же ключ не найдется, мы получим исключение KeyError:

new_dict = {"another_key": "another_value"}
 
if new_dict["key"] == "value":
    print("ok!")
else:
    print("no!")

>>> KeyError: 'key'

Чтобы этого избежать, можно использовать встроенный метод словаря get():

new_dict = {"another_key": "another_value"}
 
# Проверяем ключ безопасно с помощью get()
if new_dict.get("key") == "value":
    print("ok!")
else:
    print("no!")
 
>>> no!

Также можно просто проверить присутствие ключа в словаре, и в зависимости от этого уже выполнять какие-либо действия:

new_dict = {"another_key": "another_value"}

if new_dict.get("key"):
    ...

Здесь мы просто проверяем объект на наличие.

По умолчанию для не найденных ключей метод get() подставляет значение `None.
Вместо None можно подставить любое необходимое значение:

new_dict = {"another_key": "another_value"} 
 
# Используем значение по умолчанию для отсутствующего ключа
print(new_dict.get("key", "default_value"))
 
>>> default_value

Методы, такие как get(), делают работу со словарями в Python более безопасной. Это особенно важно при работе с данными из внешних источников, где структура словаря может быть непредсказуемой. Используя эти подходы, вы не только избежите ошибок, но и сделаете ваш код более читаемым и устойчивым к неожиданным данным.


Мой telegram-канал, присоединяйтесь :)

⬇⬇⬇

https://t.me/python3_with_love