第一个arg存在时的Python dict.get()行为,但*default*不存在

jon*_*esy 3 python dictionary

所以,我有一些包含字典的代码,我在字典上做了一些验证.验证规则基本上是字典可以包含'到'键或'到[]'键.无论它包含哪一个,我都需要返回值,这样我就可以根据字典中另一个键的长度来检查长度.

我实际上找到了解决当前问题的更好方法,但是在解决这个问题时,我在Python 2.7.1中遇到了一个奇怪的行为,这意味着dict.get()不能像我想象的那样工作,所以在我深入研究字典的C实现之前,我正在寻找一些澄清,我并不急于做:)

简短的摘要版本似乎是,如果您将默认值传递给.get(),即使第一个参数是字典中的有效键,Python也会尝试评估该默认值.

这是一个例子:

>>> toparm = 'to'
>>> toarrparm = 'to[]'
>>> d = {toparm: 'foo'}
>>> d.get(toarrparm, [d[toparm]])
['foo']
>>> d = {toarrparm: ['foo', 'bar']}
>>> d.get(toarrparm, [d[toparm]])
Traceback (most recent call last):
  File "<input>", line 1, in <module>
KeyError: 'to'
>>> d
{'to[]': ['foo', 'bar']}
>>> toarrparm
'to[]'
>>> sys.version
'2.7.1 (r271:86882M, Nov 30 2010, 10:35:34) \n[GCC 4.2.1 (Apple Inc. build 5664)]'
>>> d['to[]'] = ['foo', 'bar', 'baz']
>>> d
{'to[]': ['foo', 'bar', 'baz']}
>>> d.get(toarrparm)
['foo', 'bar', 'baz']
>>> d.get(toarrparm, [d[toparm]])
Traceback (most recent call last):
  File "<input>", line 1, in <module>
KeyError: 'to'
>>> d
{'to[]': ['foo', 'bar', 'baz']}
>>> d['to'] = 'foo'
>>> d.get(toarrparm, [d[toparm]])
['foo', 'bar', 'baz']
>>> 
Run Code Online (Sandbox Code Playgroud)

如果这种行为是旧闻,有人可以解释为什么会这样吗?如果我只是一直问我想的东西是不存在第一?如果我真的不知道哪一个会在那里怎么办?只是回过头来尝试/除外?我错过了别的什么吗?

Ign*_*ams 9

在调用函数之前,始终会评估函数或方法的参数.如果您不想这样,那么使用sentinel对象而不是表达式作为默认值.