Почему значение по умолчанию в dict.get(key[, default]) оценивается, даже если ключ находится в словаре?
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'
Как и при любом вызове функции, аргументы оцениваются перед выполнением вызова. В этом случае dict.get() не является исключением ...
dict.get()
используйте это вместо
x = b.get(key) or a.get(key)
or и and являются операторами короткого замыкания, поэтому, если у b есть ключ, он не будет смотреть на a. Но проблемы возникнут, если у вас есть falsy значения в b. Если это так, вы можете сделать ..
or
and
b
a
falsy
x = b[key] if key in b else b.get(a)
Вы можете переписать приведенный вами пример как
b.get(key, a.get(key))
, чтобы избежать исключения. Это вернет None, если ключ находится ни в одном словаре. В более общем смысле, если вы хотите избежать оценки второго аргумента, вы можете использовать
None
try: x = b[key] except KeyError: x = a[key] # or whatever the default value is supposed to be
Поскольку вы оцениваете его, передаете его в качестве аргумента get. Это происходит независимо от того, заканчивается ли get аргументом.
get
Чтобы избежать поиска, вы можете:
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]
a[key]
a['foo']
b.get