← Все вопросы

Когда лучше dict[key], а когда .get() — чтобы не ловить KeyError?

Задан 9 месяцев назад935 просмотров3 ответа
16

Постоянно спотыкаюсь на KeyError. Когда правильно обращаться напрямую d[key], а когда через d.get(key)? Есть ли разница не только в ошибке?

3 ответа

28
✓ Принятый ответ — помог автору

Разница в том, что происходит при отсутствии ключа:

  • d[key] — кидает KeyError, если ключа нет. Используйте, когда ключ ОБЯЗАН быть, и его отсутствие — это реальная ошибка в данных/логике (пусть лучше упадёт явно).
  • d.get(key) — возвращает None (или указанное значение по умолчанию), ничего не кидает. Используйте, когда отсутствие ключа — нормальная ситуация.
d = {"a": 1}
d["b"]            # KeyError
d.get("b")        # None
d.get("b", 0)     # 0 — удобно для счётчиков

Классический приём со счётчиком: counts[w] = counts.get(w, 0) + 1. А если нужно проверить наличие — if key in d:. Не злоупотребляйте .get() там, где ключ должен быть: тихий None потом всплывёт где-нибудь как 'NoneType' object is not subscriptable, и причину будет искать сложнее.

Степан Голубев Для счётчиков ещё есть collections.Counter и defaultdict(int) — но get(...,0) понятнее новичку. · 9 месяцев назад
11

Коротко: [] — «ключ точно есть, иначе это баг»; .get() — «ключа может не быть, и это норм».

2

.get(key, значение_по_умолчанию).

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект