web-dev-qa-db-fra.com

Pourquoi un double point-virgule est-il une SyntaxError en Python?

Je sais que les points-virgules ne sont pas nécessaires en Python, mais ils peuvent être utilisés pour entasser plusieurs instructions sur une seule ligne, par exemple.

>>> x = 42; y = 54

J'ai toujours pensé qu'un point-virgule équivalait à un saut de ligne. J'ai donc été un peu surpris d'apprendre (h/t Ned Batchelder sur Twitter ) qu'un double point-virgule est une SyntaxError:

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

J'ai supposé que le dernier programme était équivalent à x = 42\n\n. J'aurais pensé que la déclaration entre les points-virgules était traitée comme une ligne vide, un no-op. Apparemment non.

Pourquoi est-ce une erreur?

68
alexwlchan

De la grammaire Python, nous pouvons voir que ; n'est pas défini comme \n. L'analyseur attend une autre instruction après un ;, sauf s'il y a une nouvelle ligne après:

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

C'est pourquoi x=42;; ne fonctionne pas; car il n'y a pas de déclaration entre les deux points-virgules, car "rien" n'est pas une déclaration. S'il y avait une instruction complète entre eux, comme un pass ou même juste un 0, le code fonctionnerait.

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
104
Aaron Christiansen

Une instruction vide a toujours besoin de pass, même si vous avez un point-virgule.

>>> x = 42;pass;
>>> x
42
23
TigerhawkT3