Python字典中的dict.get()方法在第一个参数存在但*default*不存在时的行为

3
所以,我有一些包含字典的代码,并对字典进行一些验证。验证规则基本上是字典可以包含'to'键或'to[]'键。无论它包含哪一个,我都需要将值返回,以便我可以将其长度与字典中另一个键的长度进行比较。
实际上,我已经找到了解决即时问题的更好方法,但在处理这个问题时,我发现了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']
>>> 

如果这种行为已经很普遍了,有人能解释一下为什么吗?我是否应该先询问我认为不存在的东西?如果我真的不知道哪个会出现,怎么办?是退而求其次使用try/except吗?我有没有错过其他的东西?

1个回答

9

在调用函数或方法之前,始终会先评估其参数。如果您不希望这样做,请使用哨兵对象作为默认值,而不是表达式。


当然,我知道那个规则,但我想我只是陷入了一种错误的思维模式。太接近问题会导致愚蠢的错误。非常感谢你的提醒! - jonesy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接