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

Jon*_*han 23 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'
Run Code Online (Sandbox Code Playgroud)

Jon*_*han 26

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

  • +1 - 蟒蛇的禅宗:"特殊情况不足以打破规则." (3认同)
  • 我明白了逻辑,但遗憾的是“dict.get”不能用于缓存昂贵计算的结果。例如:“返回stored_results.get(x,calculate_result(x))”。 (2认同)

Dob*_*boy 12

改用它

x = b.get(key) or a.get(key)
Run Code Online (Sandbox Code Playgroud)

or并且and是短路操作员,所以如果b有钥匙就不会看a.但如果你有falsy价值观,就会出现问题b.如果是这种情况你可以做..

x = b[key] if key in b else b.get(a)
Run Code Online (Sandbox Code Playgroud)


Sve*_*ach 8

你可以重写你给出的例子

b.get(key, a.get(key))
Run Code Online (Sandbox Code Playgroud)

避免例外.None如果密钥不在字典中,则返回.更一般地说,如果你想避免评估第二个参数,你可以使用

try:
    x = b[key]
except KeyError:
    x = a[key]   # or whatever the default value is supposed to be
Run Code Online (Sandbox Code Playgroud)