Python dict.get () поведение, когда существует первый аргумент, но * default * нет - PullRequest
3 голосов
/ 22 марта 2011

Итак, у меня есть некоторый код, который содержит словарь, и я делаю некоторую проверку по словарю.Правило валидации в основном состоит в том, что словарь может содержать либо ключ «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']
>>> 

Если это поведение - старые новости, может кто-нибудь объяснить, почему это так?Должен ли я всегда спрашивать о том, что, по моему мнению, не там сначала ?Что если я действительно не знаю, кто там будет?Просто отступить, чтобы попробовать / кроме?Я что-то пропустил?

1 Ответ

9 голосов
/ 22 марта 2011

Аргументы функции или метода всегда оцениваются перед вызовом функции.Если вы не хотите этого, тогда используйте объект-страж вместо выражения по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...