Почему, если x, y: поднять SyntaxError?

Я хотел бы знать, есть ли причина, по которой следующий код вызывает SyntaxError:

>>> if 1,2:
  File "<stdin>", line 1
    if 1,2:
        ^
SyntaxError: invalid syntax
>>>

Не следует ли интерпретировать 1,2 Python как кортеж из двух элементов (который затем оценивается до True при проверке с помощью оператора if)? Следующая демонстрация предполагает, что она должна:

>>> 1,2
(1, 2)
>>> tup = 1,2
>>> bool(tup)
True
>>>

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

if_stmt ::=  "if" expression ":" suite
             ( "elif" expression ":" suite )*
             ["else" ":" suite]

Как вы можете видеть, в нем четко сказано, что синтаксис для оператора if - это ключевое слово if, за которым следует выражение. Если я не ошибаюсь, 1,2 действительно является выражением.

Наконец, можно утверждать, что этот синтаксис бесполезен, поэтому зачем его использовать? Это верно, но Zen of Python явно говорит:

Особые случаи не являются достаточно сложными, чтобы нарушать правила.

Итак, почему SyntaxError?

Ответы

Ответ 1

Это связано с тем, как Python сканирует и интерпретирует выражения. Вы получаете SyntaxError, потому что инструкции Python if не допускают наличия запятой между условиями.

Python читает инструкцию слева направо и разделяет условия запятой, если скобки явно не используются для разделения. Это означает, что ваше выражение интерпретируется следующим образом:

(1 == 1), (2)

Итак, tuple не разделяется, а два условия. Поскольку запятые не могут разделить условия, вы получаете SyntaxError. Имея это в виду, мы можем знать, почему класть скобки вокруг кортежа получает другой результат. Скобки явно используются для разделения, поэтому Python может интерпретировать tuple самостоятельно и сравнивать его. В этом случае существует только одно условие - поэтому нет ошибок.

Ответ 2

то, что вы делаете, не то, что вы думаете.

1 == 1,2: вы объявляете две вещи. 1 == 1 = True и 2.

1 == (1,2) = False: они два разных типа.

if 1 == 1,2: disableable: не утверждение, если вы думаете о том, что я показал вам, поэтому запятая (,) не только лишняя, но и неправильная.