python СинтаксисError с dict (1 = …), но {1: …} работает

Кажется, что у Python есть несогласованность в том, какие ключи он примет для dicts. Или, по-другому, он позволяет определенным типам ключей одним способом определения dicts, но не в других:

>>> d = {1:"one",2:2} >>> d[1] 'one' >>> e = dict(1="one",2=2) File "<stdin>", line 1 SyntaxError: keyword can't be an expression 

Является ли {...} более фундаментальным, а dict(...) просто синтаксическим сахаром? Это потому, что Python просто не может parse dict(1="one") ?

Мне любопытно…

4 Solutions collect form web for “python СинтаксисError с dict (1 = …), но {1: …} работает”

Это не проблема dict , но артефакт синтаксиса Python: аргументы ключевого слова должны быть действительными идентификаторами, а 1 и 2 – нет.

Если вы хотите использовать что-либо, не являющееся строкой, следуя правилам идентификатора Python в качестве ключа, используйте синтаксис {} . Синтаксис аргумента ключевого слова конструктора просто для удобства в некоторых особых случаях.

dict – это вызов функции, а ключевые слова функции должны быть идентификаторами.

Если вы прочтете документацию , вы узнаете, что dict = {stringA = 1, stringB = 2} действительна, когда ключи являются простыми строками:

Когда ключи являются простыми строками, иногда проще указывать пары с использованием аргументов ключевого слова:

 >>> >>> dict(sape=4139, guido=4127, jack=4098) {'sape': 4139, 'jack': 4098, 'guido': 4127} 

Поскольку целые числа (или другие числа) не являются допустимыми аргументами ключевого слова, dict = {1 = 2, 3 = 4} будет терпеть неудачу, поскольку любой вызов функции будет, если вы передали ему аргумент, назвав его номером:

 >>> def test(**kwargs): ... for arg in kwargs: ... print arg, kwargs[arg] ... >>> test(a=2,b=3) a 2 b 3 >>> test(1=2, 3=4) File "<stdin>", line 1 SyntaxError: keyword can't be an expression 

Как сказал другой ответ, dict – это вызов функции. Он имеет три синтаксических формы.

Форма:

 dict(**kwargs) -> new dictionary initialized with the name=value pairs in the keyword argument list. For example: dict(one=1, two=2) 

Ключи (или name используемые в этом случае) должны быть действительными идентификаторами Python, а int недействительны.

Ограничение – это не только функция dict Вы можете продемонстрировать это так:

 >>> def f(**kw): pass ... >>> f(one=1) # this is OK >>> f(1=one) # this is not File "<stdin>", line 1 SyntaxError: keyword can't be an expression 

Однако есть две другие синтаксические формы, которые вы можете использовать.

Там есть:

 dict(iterable) -> new dictionary initialized as if via: d = {} for k, v in iterable: d[k] = v 

Пример:

 >>> dict([(1,'one'),(2,2)]) {1: 'one', 2: 2} 

И из картографирования:

 dict(mapping) -> new dictionary initialized from a mapping object's (key, value) pairs 

Пример:

 >>> dict({1:'one',2:2}) {1: 'one', 2: 2} 

Хотя это может показаться не очень большим (диктовка из литерала dict), помните, что Counter и defaultdict являются сопоставлениями, и именно так вы можете скрывать один из них в dict:

 >>> from collections import Counter >>> Counter('aaaaabbbcdeffff') Counter({'a': 5, 'f': 4, 'b': 3, 'c': 1, 'e': 1, 'd': 1}) >>> dict(Counter('aaaaabbbcdeffff')) {'a': 5, 'c': 1, 'b': 3, 'e': 1, 'd': 1, 'f': 4} 
  • Pythonic способ объединить два списка кортежей в один список dict
  • Как слить несколько dicts с одним ключом?
  • Расширение словаря Python
  • Краткий хэш-эквивалент Ruby для Python dict.get ()
  • Итерация по словарю возвращает ключи в отсортированном порядке
  • У Python есть словарь с одноименными ключами?
  • Как изменить поведение словаря __setattr__ в словаре python?
  • Как добавить несколько значений в ключ словаря в python?
  • Python - лучший язык программирования в мире.