dict.get () - значение по умолчанию оценивается даже при успехе - PullRequest
18 голосов
/ 18 марта 2012

Почему значение по умолчанию в dict.get(key[, default]) оценивается, даже если ключ находится в словаре?

>>> key = 'foo'
>>> a={}
>>> b={key:'bar'}
>>> b.get(key, a[key])
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    b.get(key, a[key])
KeyError: 'foo'

Ответы [ 6 ]

20 голосов
/ 18 марта 2012

Как и при любом вызове функции, аргументы оцениваются перед выполнением вызова.
В этом случае dict.get() не является исключением ...

8 голосов
/ 19 марта 2012

используйте это вместо

x = b.get(key) or a.get(key)

or и and являются операторами короткого замыкания, поэтому, если у b есть ключ, он не будет смотреть на a. Но проблемы возникнут, если у вас есть falsy значения в b. Если это так, вы можете сделать ..

x = b[key] if key in b else b.get(a)
7 голосов
/ 18 марта 2012

Вы можете переписать приведенный вами пример как

b.get(key, a.get(key))

, чтобы избежать исключения. Это вернет None, если ключ находится ни в одном словаре. В более общем смысле, если вы хотите избежать оценки второго аргумента, вы можете использовать

try:
    x = b[key]
except KeyError:
    x = a[key]   # or whatever the default value is supposed to be
3 голосов
/ 18 марта 2012

Поскольку вы оцениваете его, передаете его в качестве аргумента get. Это происходит независимо от того, заканчивается ли get аргументом.

1 голос
/ 19 марта 2012

Чтобы избежать поиска, вы можете:

value = b.get(key)
if value is None:
   value = a[key]

Или, если разрешено None, то:

not_set = object()
# ...
value = b.get(key, not_set)
if value is not_set:
   value = a[key]
0 голосов
/ 18 марта 2012
  1. a[key] - это a['foo'], и у вас нет этого ключа в a.
  2. это оценивается перед вызовом b.get, следовательно, ошибка
  3. «даже если ключ находится в словаре» - это не так, b пусто (но, как показывает пункт 2., это не имеет значения)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...