Подтвердить что ты не робот

Когда требуются круглые скобки вокруг кортежа?

Есть ли ссылка где-то точно определяющая, когда вложение кортежей с круглыми скобками является или не требуется?

Вот пример, который недавно меня удивил:

>>> d = {}
>>> d[0,] = 'potato'
>>> if 0, in d:
  File "<stdin>", line 1
    if 0, in d:
        ^
SyntaxError: invalid syntax
4b9b3361

Ответ 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