我遇到了一个奇怪的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
在字典中,如果不是-检查另一部分?现在看来不是最佳的计算方式吗?
答案 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
构造即可。