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

Почему двойной точкой с запятой является SyntaxError в Python?

Я знаю, что точки с запятой не нужны в Python, но их можно использовать для перебора нескольких операторов на одну строку, например.

>>> x = 42; y = 54

Я всегда думал, что точка с запятой эквивалентна разрыву строки. Поэтому я был немного удивлен, узнав (h/t Ned Batchelder on Twitter), что двойной точкой с запятой является SyntaxError:

>>> x = 42
>>> x = 42;
>>> x = 42;;
  File "<stdin>", line 1
    x = 42;;
           ^
SyntaxError: invalid syntax

Я предположил, что последняя программа была эквивалентна x = 42\n\n. Id считал, что выражение между точками с запятой трактуется как пустая строка, no-op. Видимо, нет.

Почему это ошибка?

4b9b3361

Ответ 1

Из грамматики Python мы видим, что ; не определяется как \n. Парсер ожидает другого оператора после ;, за исключением того, что после него появляется новая строка:

                     Semicolon w/ statement    Maybe a semicolon  Newline
                          \/     \/               \/                \/
simple_stmt: small_stmt (';' small_stmt)*        [';']            NEWLINE

Вот почему x=42;; не работает; потому что между двумя точками с запятой нет утверждения, поскольку "ничего" не является выражением. Если между ними существует полная инструкция, например pass или даже просто 0, код будет работать.

x = 42;0; # Fine
x = 42;pass; # Fine
x = 42;; # Syntax error

if x == 42:; print("Yes") # Syntax error - "if x == 42:" isn't a complete statement

Ответ 2

Пустой оператор все еще нуждается в pass, даже если у вас есть точка с запятой.

>>> x = 42;pass;
>>> x
42