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") ?

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

    Это не проблема 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}