dict.get() - это удобно или опасно?
Всегда использовал dict.get(key, default) для безопасного доступа к словарю:
python data = {'name': 'Alice'} age = data.get('age', 0) # 0 Но недавно прочитал, что некоторые разработчики считают это плохой практикой. Аргументы:
Если ключ действительно существует, но его значение — None, то вы не отличите отсутствие ключа от ключа со значением None.
Это маскирует ошибки — проще случайно получить None и не заметить.
Вопрос: как вы поступаете в реальных проектах? Используете get() или предпочитаете try/except? И когда get() действительно оправдан?
1 ответ
dict.get — норм инструмент, «опасным» его зовут в паре конкретных ситуаций, а не вообще.
где реально удобен: ключа может не быть, это ожидаемо, и дефолт осмысленный. data.get('age', 0) — ок.
где стреляет:
- когда
None— валидное значение.d.get('x')вернётNoneи если ключа нет, и если он есть со значениемNone— эти два случая ты не различишь. тогда лучше'x' in dилиd.get('x', sentinel)с уникальным маркером. - когда ключ по логике ОБЯЗАН быть. если его нет — это баг, и пусть лучше громко упадёт с
KeyError(черезd['x']), чем тихо подставит дефолт и понесёт кривые данные дальше.getтут просто маскирует ошибку.
так что вопрос не «удобно или опасно», а «смотри по смыслу»: ключ опциональный → get с дефолтом, ключ обязательный → квадратные скобки и пусть падает, важно отличать «нет ключа» от «значение None» → in или sentinel