python get key for dict 计算默认部分,即使该键存在

python get key for dict evaluates defulat part even when the key exists

我的理解dict.get() was that if the key exists, then no evaluation of the default argument is made. And several sources含蓄地离开了这种解释。但事实并非如此

让我们假设有一个 dict 具有 str 或 int 类型的整数键。 因此,检索值模块键类型的一行是使用 .get,默认值取决于替代类型的键。

>>> d = {'2':4} 
>>> d.get(2, d['2'])
4
>>> d.get('2', d[2])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 2

如果密钥存在,评估默认参数有什么意义? 这只是该方法的糟糕设计,还是我过度概括了 .get() 的预期功能?

这种情况下的主要区别是表达式 d[2] 在作为参数传递给 get 函数之前必须先求值。

发生异常是因为您在此表达式中引用了一个不存在的整数键 2,然后再检查 d['2'] 键是否存在于该字典中。

请查找参考:Expressions 6.3.4. Calls

主要对象必须评估为可调用对象(用户定义的函数、内置函数......以及所有具有 __call__() 方法的对象都是可调用的)。 在尝试调用之前计算所有参数表达式。

Python 不是一种惰性语言,因此函数的所有参数都会在函数被调用之前求值。这意味着,在您的第二个示例中,将在调用 d.get 之前评估 d[2]。有些语言(如 Haskell)会接受此代码,因为参数仅在需要时进行评估。

参数总是被评估,我不知道有任何主流过程语言允许声明函数,以便延迟参数评估,直到以某种方式明确解决。

如何推迟评估:

d = { '2': 4 }
x = d.get('3', lambda: d[2])
print(x() if callable(x) else x)

..但这是一个非常愚蠢的例子。

编辑:另一种(危险的)延迟计算的方法:

x = d.get('2', False) or d[2]

.. 假设 dict 没有有效结果评估为 False(如 0None)。这是搬起石头砸自己脚的好方法。