Python
Как проверить наличие ключа в словаре Python
Проверка ключа нужна, чтобы программа не падала, когда данных не хватает. Это частая ситуация: пользователь не указал email, API не вернул поле, в настройках нет темы, у товара отсутствует скидка
Главное правило: оператор in проверяет ключи словаря, а не значения. Если написать "Анна" in user, Python будет искать ключ "Анна", а не имя внутри словаря
По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы
По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы
Проверка через in
user = {"name": "Анна", "city": "Казань"}
if "email" in user:
print(user["email"])
else:
print("email не указан")
Такой вариант удобен, когда нужно выполнить разные действия: одно при наличии ключа, другое при его отсутствии
get вместо проверки
Если нужно просто получить значение с запасным вариантом, используйте get
user = {"name": "Анна"}
email = user.get("email", "email не указан")
print(email)
get не добавляет ключ в словарь. Он только возвращает значение или запасной результат
Ключ есть, но значение пустое
Важно отличать отсутствующий ключ от пустого значения
user = {"email": ""}
print("email" in user)
print(user.get("email", "email не указан"))
В этом примере ключ есть, но значение пустая строка. Для формы регистрации это разные случаи: поле пришло, но пользователь ничего не ввел
Проверка вложенного словаря
Когда данные вложенные, проверяйте каждый уровень или используйте get цепочкой
profile = {
"user": {
"name": "Анна"
}
}
user = profile.get("user", {})
city = user.get("city", "город не указан")
print(city)
Если сразу написать profile["user"]["city"], код упадет при отсутствии любого ключа
Практика: данные заявки
def normalize_request(data):
result = {
"name": data.get("name", "Без имени"),
"phone": data.get("phone", ""),
"source": data.get("source", "site"),
}
if not result["phone"]:
result["status"] = "нужно уточнить телефон"
else:
result["status"] = "готово к обработке"
return result
print(normalize_request({"name": "Илья", "phone": "+79990000000"}))
print(normalize_request({"name": "Мария"}))
Здесь проверка ключей помогает не потерять заявку и явно показать, каких данных не хватает
Частые ошибки
- искать значение через
inпо словарю - читать ключ до проверки
- путать отсутствующий ключ и пустую строку
- думать, что
getизменяет словарь - не проверять вложенные данные
Самопроверка
Создайте словарь настроек и прочитайте ключи theme, language, timezone. Для одного ключа задайте значение, два оставьте пустыми. Проверьте вариант через in и вариант через get. После этого будет понятно, когда нужен явный if, а когда достаточно запасного значения
in, keys и values
Оператор in по словарю проверяет ключи. Запись "email" in user и "email" in user.keys() дают похожий смысл, но первый вариант короче и привычнее
user = {"name": "Анна", "email": "a@example.com"}
print("email" in user)
print("Анна" in user)
print("Анна" in user.values())
Если нужно искать значение, используйте values, но для частого поиска значений словарь может быть не лучшей структурой
Проверка обязательных полей
Для заявки, товара или профиля удобно заранее проверить список обязательных ключей
def missing_fields(data, required):
missing = []
for field in required:
if field not in data or data[field] in ("", None):
missing.append(field)
return missing
request = {"name": "Анна", "phone": ""}
print(missing_fields(request, ["name", "phone", "email"]))
Так программа не падает и сразу показывает, какие поля нужно заполнить
Где это встречается
Проверка ключей нужна при чтении JSON, обработке форм, разборе API, настройках приложения и данных из таблиц. В этих местах нельзя рассчитывать, что все поля всегда будут на месте. Лучше один раз сделать явную проверку, чем потом искать KeyError в середине сценария
Итоговая тренировка: проверка заявки
Представьте, что форма присылает словарь. Для обработки заявки нужны имя и телефон, а email необязателен. Напишите проверку так, чтобы программа не падала и возвращала понятный результат
def validate_lead(lead):
errors = []
if "name" not in lead or not lead["name"]:
errors.append("не указано имя")
if "phone" not in lead or not lead["phone"]:
errors.append("не указан телефон")
return errors
print(validate_lead({"name": "Анна", "phone": "+79990000000"}))
print(validate_lead({"name": ""}))
Теперь добавьте необязательный email через get
lead = {"name": "Анна", "phone": "+79990000000"}
email = lead.get("email", "email не указан")
print(email)
Как выбрать между in и get
Используйте in, когда нужно понять, есть ли ключ, и выполнить разные действия. Используйте get, когда нужно спокойно получить значение с запасным вариантом. Для обязательных полей лучше явная проверка, для необязательных — get
Эта разница особенно важна в формах и API. Обязательный телефон нельзя тихо заменить пустой строкой, иначе заявка станет бесполезной. А необязательный комментарий можно спокойно заменить текстом «не указан»
Как проверить себя на трех словарях по проверке ключей
Сделайте три проверки на одном словаре: есть ли ключ email, есть ли значение Анна, есть ли обязательные поля name и phone. Для первой задачи нужен in, для второй — values, для третьей — цикл по списку обязательных полей
Такой набор хорошо показывает разницу между проверкой ключа и проверкой значения. В реальном коде это важно: если вы случайно ищете email в значениях, а потом читаете его как ключ, программа будет вести себя непредсказуемо. Держите правило простым: словарь по умолчанию ищет ключи, а значения нужно проверять отдельно
Что запомнить про проверку ключа
Если нужно проверить ключ, пишите key in data. Если нужно получить значение без падения, используйте data.get(key, default). Если нужно убедиться, что заполнены обязательные поля, лучше написать отдельную функцию проверки. Так код получается понятнее, чем набор случайных условий в разных местах программы
Хорошее упражнение для закрепления — взять один словарь заявки и намеренно удалить из него разные поля. Так быстро видно, какие проверки защищают программу, а какие только создают видимость надежности
Три способа проверить ключ
user = {"name": "Анна", "city": "Казань"}
print("city" in user)
print(user.get("city") is not None)
print(user.keys())
Самый прямой способ — "city" in user. Он проверяет именно наличие ключа, а не значение. Это важно, потому что ключ может существовать, но хранить None, пустую строку или ноль
Когда get может обмануть
settings = {"limit": 0}
if settings.get("limit"):
print("лимит есть")
else:
print("лимита как будто нет")
Здесь ключ есть, но значение 0 считается ложным. Если нужно проверить именно ключ, пишите if "limit" in settings. Если нужно проверить непустое значение, тогда get подходит
Практика с обязательными и необязательными полями
Сделайте словарь заказа. id и total пусть будут обязательными, а comment — необязательным. Для обязательных полей используйте проверку через in, для комментария — get("comment", ""). Так вы сразу разделите разные смыслы проверки