← Все вопросы
Когда лучше dict[key], а когда .get() — чтобы не ловить KeyError?
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, значение_по_умолчанию).
Ваш ответ
Войдите, чтобы ответить на вопрос.