Почему, если 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: не утверждение, если вы думаете о том, что я показал вам, поэтому запятая (,) не только лишняя, но и неправильная.