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?
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
Une instruction vide a toujours besoin de pass
, même si vous avez un point-virgule.
>>> x = 42;pass;
>>> x
42