Подвыражение в скобках также может быть вызвано, поскольку оно может быть функцией, даже не содержащей имени: (lambda: 1)()
. Глядя на грамматику, я не могу точно сказать, как именно она анализируется (кажется, что это не yield_expr
или testlist_comp
, но я не вижу ничего, кроме atom
, которое можно использовать вызовите скобки после любого из них).
Несмотря на это, парсер не выполняет принудительные семантические проверки. 1()
вполне может интерпретироваться как попытка вызвать номер 1 без аргументов; означает ли это что-нибудь или нет, зависит от переводчика. Сбои синтаксического анализатора относятся к случаям, когда интерпретатор не может выяснить, какие операции запрашивает код, даже пытаясь их выполнить.
Выделение NAME
как единственного законного трейлера вызова функций добавило бы ненужную сложность к грамматике для небольшой реальной выгоды. Python уже имеет достаточно хороший механизм для сообщения об ошибке при попытке вызвать что-то, что не может быть вызвано, и этот механизм является исключением во время выполнения. Исключение во время выполнения всегда должно было бы существовать, потому что существует множество имен, связанных с не вызываемыми объектами, поэтому использование концептуального механизма везде менее затратно.
Это было бы немного нелогично и на уровне программиста на Python. В моем внутреннем мышлении о синтаксисе Python есть другие вещи, которые не являются синтаксически именами, которые вполне разумно называть, например, следующее:
result()()
dict_of_funcs[name]()
Просто так получилось, что ни один из них не был разобран как atom
(потому что они скорее разбираются как один atom
, за которым следуют несколько trailer
с), но я не думаю насчет языка Python, я просто думаю, что «вы можете вызывать все, что является выражением» (правила старшинства по модулю, которые могут потребовать добавления скобок), и при таком понимании я был бы удивлен, если не смог вызвать целое число или строку ( тем более что я могу, когда это имя, а не буквальное).
Это также усложнит изменение семантики языка. Представьте себе гипотетическое будущее изменение языка, в котором вызов словаря определен так же, как поиск ключа, чтобы я мог написать {1: 'foo'}(1)
. В соответствии с текущей грамматикой все, что потребуется, это реализовать эквивалент __call__
для встроенного типа dict
. Если бы только NAME
и не другие атомы могли иметь трейлер '(' [arglist] ')'
, то это привело бы к несоответствию, в котором нельзя было бы вызвать буквальное значение dict
, но можно было бы назвать имя, связанное со значением dict
. Несоответствие, похожее на это, уже существует, когда x.__class__
хорошо, а 1.__class__
нет, но это просто компромисс из-за существования литералов с плавающей запятой, таких как 1.0
. Нет аналогичного случая сделать 1()
недопустимым синтаксисом, а не просто вызывать исключение.