dict.get() - 即使成功,也会对默认arg进行评估

时间:2012-03-18 19:12:11

标签: python dictionary

为什么即使密钥在字典中,也会评估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 个答案:

答案 0 :(得分:20)

与任何函数调用一样,在执行调用之前会计算参数 在这种情况下,dict.get()也不例外......

答案 1 :(得分:8)

使用此代替

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

orand是短路运算符,因此如果b有密钥,则不会查看a。但如果falsy中有b个值,则会出现问题。如果是这种情况你可以做..

x = b[key] if key in b else b.get(a)

答案 2 :(得分:7)

您可以重写您提供的示例

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 :(得分:3)

因为您正在评估它,所以将它作为参数传递给get。无论get是否最终使用参数,都会发生这种情况。

答案 4 :(得分:1)

为避免查询,您可以:

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]

答案 5 :(得分:0)

  1. a[key]a['foo'],您在a中没有该密钥。
  2. 在调用b.get之前评估此错误
  3. “即使密钥在字典中” - 这是真的,b是空的(但是如第2点所示,这是不相关的)