68 votes

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

Je sais que les points-virgules sont inutiles en Python, mais ils peuvent être utilisés pour fourrer plusieurs instructions sur une seule ligne, par exemple

>>> x = 42; y = 54

J'ai toujours pensé qu'un point-virgule a été l'équivalent d'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 un SyntaxError:

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

J'ai pris le dernier programme est équivalent à x = 42\n\n. J'aurais pensé l'instruction entre les deux points a été traité comme une ligne vide, un non-op. Apparemment pas.

Pourquoi est-ce une erreur?

104voto

OrangeFlash81 Points 3507

À partir du Python, de la grammaire, nous pouvons voir qu' ; n'est pas défini en tant que \n. L'analyseur s'attend à une déclaration après un ;, sauf si il y a un saut de 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 une instruction entre les deux points-virgules, comme "rien" n'est pas une déclaration. S'il y avait un énoncé complet entre eux, comme un pass ou même de quelques 0, le code du travail.

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

23voto

TigerhawkT3 Points 25584

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X