【问题标题】:Python dict.get() behavior when first arg exists but *default* doesn'tPython dict.get() 当第一个 arg 存在但 *default* 不存在时的行为
【发布时间】:2011-03-22 13:23:21
【问题描述】:

所以,我有一些包含字典的代码,并且我对字典进行了一些验证。验证规则基本上是字典可能包含“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']
>>> 

如果这种行为是旧闻,有人可以解释为什么会这样吗?我是否应该总是要求我认为存在首先的东西?如果我真的不知道哪一个会在那里呢?只是回退去尝试/除外?我错过了什么吗?

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    函数或方法的参数总是在函数被调用之前进行评估。如果您不希望这样,请使用哨兵对象而不是表达式作为默认值。

    【讨论】:

    • 天啊!我当然知道这条规则,但我想我只是处于一种糟糕的思维模式。太接近问题==愚蠢的错误。非常感谢您的提醒!
    猜你喜欢
    • 2016-01-20
    • 2014-04-14
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 2018-01-17
    • 2016-06-28
    相关资源
    最近更新 更多