为什么即使密钥在字典中,也会评估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'
答案 0 :(得分:20)
与任何函数调用一样,在执行调用之前会计算参数
在这种情况下,dict.get()
也不例外......
答案 1 :(得分:8)
使用此代替
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)
答案 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)
a[key]
为a['foo']
,您在a
中没有该密钥。b.get
之前评估此错误b
是空的(但是如第2点所示,这是不相关的)