Когда требуются круглые скобки вокруг кортежа?
Есть ли ссылка где-то точно определяющая, когда вложение кортежей с круглыми скобками является или не требуется?
Вот пример, который недавно меня удивил:
>>> d = {}
>>> d[0,] = 'potato'
>>> if 0, in d:
File "<stdin>", line 1
if 0, in d:
^
SyntaxError: invalid syntax
Ответы
Ответ 1
Объединение выражений для создания кортежа с использованием токена comma называется expression_list
. Правила приоритета оператора не охватывают списки выражений; это потому, что списки выражений сами по себе не являются выражениями; они становятся выражениями, заключенными в круглые скобки.
Таким образом, незанятый expression_list
разрешен в любом месте Python, что он определенно разрешен грамматикой языка, но не там, где требуется expression
.
Например, грамматика выражения if выглядит следующим образом:
if_stmt ::= "if" expression ":" suite
( "elif" expression ":" suite )*
["else" ":" suite]
Поскольку ссылка на expression
указана, незарегистрированные expression_list
не допускаются как субъект оператора if
. Однако для утверждения принимает expression_list
:
for_stmt ::= "for" target_list "in" expression_list ":" suite
["else" ":" suite]
Таким образом, допустимо следующее:
for x in 1, 2, 3:
print(x)
Ответ 2
В любом месте вам разрешено использовать термин expression_list
, вам не нужно использовать скобки.
Оператор if
требует expression
и не поддерживает expression_list
.
Примеры синтаксиса, который позволяет expression_list
:
Грепинг Expressions, Simple и Документация по составным документам для expression_list
расскажет вам все местоположения, которые expression_list
используется в грамматике Python.
Ответ 3
Скобки также требуются, если вы хотите избежать двусмысленности.
Ниже приведены два разных выражения... только потому, что что-то является "списком выражений", не приводит к списку выражений, который вы могли бы ожидать:)
(1, 2, 3) + (4, 5) # results in (1, 2, 3, 4, 5) because + does sequence.extend on the tuples
1, 2, 3 + 4, 5 # this results in (1, 2, 7, 5) because + adds the elements, since there were no parentheses to protect the separate tuples