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

2024-04-26 22:30:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个奇怪的Python行为,很难向自己解释。当我传递一个默认值以从dict中获取一个键时,看起来它首先尝试查找该默认值,然后再查找键是否存在。如果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在dict中,如果不是-检查另一部分?现在看来这不是最佳的计算方法?你知道吗


Tags: fromtestobjget错误密钥情况red
1条回答
网友
1楼 · 发布于 2024-04-26 22:30:30

它与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构造。你知道吗

相关问题 更多 >