Python

Метод get в словаре Python

Метод get возвращает значение по ключу и не падает, если ключа нет. Это главный способ спокойно читать необязательные поля в словаре

Прямое обращение data["city"] подходит, когда ключ точно есть. Если ключ может отсутствовать, get помогает задать запасное значение и не ловить KeyError

Базовый пример

user = {"name": "Анна"}

city = user.get("city", "город не указан")
print(city)

Если ключа city нет, программа выведет запасной текст. Словарь при этом не изменится

Чем get отличается от квадратных скобок

user = {"name": "Анна"}

print(user.get("email"))
print(user.get("email", "email не указан"))

Без второго аргумента get вернет None. Со вторым аргументом вернет указанное значение по умолчанию

Если написать user["email"], будет ошибка KeyError

get не добавляет ключ

settings = {}

theme = settings.get("theme", "light")

print(theme)
print(settings)

После вызова get словарь остается пустым. Если нужно добавить значение, присвойте его явно

settings["theme"] = settings.get("theme", "light")
print(settings)

Подсчет повторов через get

get часто используют для счетчиков

words = ["python", "sql", "python", "html"]
counts = {}

for word in words:
    counts[word] = counts.get(word, 0) + 1

print(counts)

Если слово встретилось впервые, get(word, 0) вернет ноль. Потом к нему добавляется единица

Чтение вложенных данных

Для вложенных словарей используйте запасной пустой словарь

payload = {
    "user": {
        "name": "Анна"
    }
}

user = payload.get("user", {})
email = user.get("email", "email не указан")

print(email)

Такой вариант безопаснее, чем сразу писать payload["user"]["email"]

Практика: настройки приложения

def normalize_settings(settings):
    return {
        "theme": settings.get("theme", "light"),
        "language": settings.get("language", "ru"),
        "notifications": settings.get("notifications", True),
    }

print(normalize_settings({"theme": "dark"}))
print(normalize_settings({}))

Функция показывает, как из неполных настроек получить полный набор значений

Частые ошибки

  • думать, что get добавляет ключ в словарь
  • не задавать значение по умолчанию, хотя оно нужно
  • путать отсутствующий ключ и ключ со значением None
  • строить длинную цепочку get(...).get(...) без проверки типа
  • использовать get, когда отсутствие ключа должно быть явной ошибкой

Когда не нужен get

Если ключ обязателен и его отсутствие означает ошибку данных, прямое обращение через квадратные скобки может быть честнее. Например, у заказа должен быть id, у товара должен быть title, у настройки подключения должен быть адрес сервера. get полезен для необязательных полей, но не должен прятать настоящие проблемы в данных

get и значение None

Если ключ есть, но его значение равно None, запасное значение из get не сработает

user = {"city": None}

print(user.get("city", "город не указан"))

Python вернет None, потому что ключ найден. Если None тоже нужно заменить, проверьте результат отдельно

city = user.get("city")

if city is None:
    city = "город не указан"

print(city)

Это важно для данных из API, где поле может прийти пустым осознанно

По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы

По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы

get и setdefault

get читает значение, а setdefault читает и при необходимости добавляет ключ

settings = {}

theme = settings.get("theme", "light")
language = settings.setdefault("language", "ru")

print(theme)
print(language)
print(settings)

После get словарь не изменился по ключу theme, а после setdefault появился ключ language

Проверка обязательных настроек

Не все поля стоит читать через get. Если без ключа программа не может работать, лучше явно показать ошибку

def require_setting(settings, key):
    if key not in settings:
        raise KeyError(f"Нет обязательной настройки: {key}")
    return settings[key]

config = {"host": "localhost"}

print(require_setting(config, "host"))

Такой подход честнее для обязательных параметров: проблема не прячется под запасным значением

Итоговая тренировка: безопасное чтение профиля

Соберите функцию, которая принимает неполный профиль и возвращает нормализованный словарь с запасными значениями

def normalize_profile(profile):
    name = profile.get("name", "Без имени")
    city = profile.get("city") or "город не указан"
    role = profile.get("role", "user")

    return {
        "name": name,
        "city": city,
        "role": role,
    }

print(normalize_profile({"name": "Анна", "city": ""}))
print(normalize_profile({}))

Обратите внимание на строку с городом: здесь используется or, чтобы заменить не только отсутствующий ключ, но и пустую строку

Где get особенно выручает

get удобен в данных, которые приходят извне: формы, API, JSON, CSV, настройки пользователя, словари после парсинга. В таких местах часть полей может отсутствовать, и код должен либо подставить запасное значение, либо аккуратно показать ошибку

Но не превращайте get в способ скрывать проблемы. Если поле обязательно, проверяйте его явно. Если поле необязательное, задавайте понятное значение по умолчанию. Эта граница делает код честнее и помогает быстрее находить ошибки в данных

Как выбрать между get и квадратными скобками по get

Проверьте четыре случая: ключ есть, ключа нет, ключ есть со значением None, ключ есть с пустой строкой. Именно на этих примерах лучше всего видно, когда второго аргумента get достаточно, а когда нужна дополнительная проверка через or или is None

Для практики напишите функцию, которая читает настройки theme, language и timezone. Тема и язык могут иметь значения по умолчанию, а часовой пояс пусть будет обязательным. Так вы разделите необязательные и обязательные поля, вместо того чтобы везде бездумно использовать get

Что запомнить про get

get хорош для необязательных ключей: город, комментарий, тема оформления, дополнительный email. Для обязательных ключей лучше явная проверка. Если без поля программа не может работать, запасное значение может только спрятать ошибку. Поэтому сначала решите, ключ обязательный или нет, и только потом выбирайте способ чтения

После этого сравните два варианта кода: один с get, второй с явным if key not in data. Если второй вариант понятнее для обязательного поля, оставьте его. Короткая запись не всегда лучше ясной проверки

Где get особенно полезен

get хорошо работает там, где данные приходят не полностью: анкеты, настройки, JSON, ответы сервисов, строки из таблиц. В таких местах часть полей может отсутствовать, но программа все равно должна показать понятный результат

raw_user = {"name": "Анна", "city": ""}

name = raw_user.get("name", "Без имени")
city = raw_user.get("city") or "город не указан"
role = raw_user.get("role", "user")

print(name, city, role)

Здесь для города используется or, потому что пустая строка тоже не подходит. Второй аргумент get сработал бы только при отсутствии ключа

Как не спрятать настоящую ошибку

Если ключ обязателен, не заменяйте его молча. Для заказа id должен быть всегда. Для товара title тоже. В таких случаях лучше явно остановить программу и показать, что данные повреждены

def require_key(data, key):
    if key not in data:
        raise KeyError(f"Нет обязательного поля: {key}")
    return data[key]
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x