python的dict .get()方法如何检查默认参数?

时间:2019-01-23 14:58:21

标签: python

我遇到了一个奇怪的Python行为,很难向我自己解释。当我传递用于从dict获取密钥的默认值时-看起来首先尝试找到该默认值,然后再查找是否存在密钥。如果字典中存在键,则会引发错误。为什么会发生这种情况?

from collections import namedtuple
Test = namedtuple("TEST", "attr1 attr2 attr3")
obj_1 = Test("first", "second", "third")

obj_1.attr1
>>> 'first'
k_dict = {"red": "light", "green": "leaf"}    

k_dict.get("red")
>>> 'light'

k_dict.get("red", obj_1.attr4)

Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'TEST' object has no attribute 'attr4'

更新:我了解这里的问题,但我不明白为什么这是Python的默认行为?为什么不仅仅检查第一部分-如果key在字典中,如果不是-检查另一部分?现在看来不是最佳的计算方式吗?

1 个答案:

答案 0 :(得分:4)

它与dict.get无关

在python中调用函数时,将对参数进行求值。

在您的情况下,密钥存在,但是在进行密钥查找之前,两个参数都需要求值。

例如,“工作”将是:

k_dict.get("red") or obj_1.attr4

由于red键存在,因此不评估第二个参数。仅在red不存在时崩溃。在这种情况下,它并没有多大帮助(无论结果如何,您的捕获方式都应能捕获错误,至少要继续这样做!),但是如果您要执行一些复杂的计算作为默认参数,它就可以了。会:

k_dict.get("red",super_expensive_computation())
即使在以下情况下,即使存在red

也很慢:

k_dict.get("red") or super_expensive_computation()
red存在时

很快。 or技术依赖于以下事实:值不能为0,而不能为None。否则,只需使用if "red" in k_dict构造即可。