Warum ist ein doppeltes Semikolon ein SyntaxError in Python?

68

Ich weiß, dass Semikolons in Python nicht erforderlich sind, aber sie können verwendet werden, um mehrere Anweisungen in eine einzelne Zeile zu packen, z

>>> x = 42; y = 54

Ich habe immer gedacht, dass ein Semikolon einem Zeilenumbruch entspricht. Daher war ich etwas überrascht zu erfahren (h / t Ned Batchelder auf Twitter ), dass ein doppeltes Semikolon ein SyntaxError ist:

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

Ich nahm an, dass das letzte Programm gleichwertig war x = 42\n\n. Ich hätte gedacht, dass die Aussage zwischen den Semikolons als leere Zeile behandelt wird, als No-Op. Scheinbar nicht.

Warum ist das ein Fehler?

alexwlchan
quelle
9
Ein Semikolon ist nicht gleichbedeutend mit einem Zeilenumbruch, ansonsten if condition:;wären solche Dinge auch legal, aber nicht.
tobias_k
@tobias_k Nein, das wäre nicht legal. Sie würden einen "Pass" benötigen. Aber 'if Bedingung :; pass' funktioniert auch nicht.
Palsch
2
Warum sollte es kein Fehler sein? Es gibt keinen Grund, solchen Code zu schreiben, und es wird wahrscheinlich denjenigen verwirren, der ihn als nächstes liest, und ihn daher nicht völlig illegal machen (Sie daran hindern, Tippfehler zu machen, und Ihre Mitarbeiter sich fragen, wie sich die Doppelpunkt-Syntax auswirkt Ist es für Python hilfreich, wenn sie den Code sehen?
Mark Amery
Würden Sie erwarten print [1, 2,, 3]zu arbeiten? Es ist so ziemlich das Gleiche.
Luaan

Antworten:

104

Aus der Python-Grammatik können wir erkennen, dass dies ;nicht definiert ist als \n. Der Parser erwartet nach a eine weitere Anweisung ;, es sei denn, danach steht ein Zeilenumbruch:

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

Deshalb x=42;;funktioniert es nicht. weil es keine Aussage zwischen den beiden Semikolons gibt, da "nichts" keine Aussage ist. Wenn es eine vollständige Aussage zwischen ihnen gäbe, wie eine passoder auch nur eine 0, würde der Code funktionieren.

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
Aaron Christiansen
quelle
Man könnte auch sagen, dass das nicht terminale small_stmt nicht nullwertfähig ist, dh die leere Zeichenfolge (epsilon) stimmt nicht mit small_stmt überein. Dies ist in anderen Sprachen der Fall.
thwd
vielleicht ein Tippfehler: Syntaxfehler - "wenn x == 2 :" sollte vielleicht 42 sein?
Ron Klein
23

Eine leere Anweisung wird weiterhin benötigt pass, auch wenn Sie ein Semikolon haben.

>>> x = 42;pass;
>>> x
42
TigerhawkT3
quelle
1
Aber eine leere Zeile kann ohne Durchgang analysiert werden, so dass diese Antwort nicht den Unterschied zwischen einem Zeilenumbruch und einem
Semikolon erklärt
3
@ SuperBiasedMan - Ich sagte eine leere Anweisung, keine leere Zeile.
TigerhawkT3
Ah, jetzt verstehe ich. Es könnte sich lohnen, die Unterscheidung klarer zu machen, dass eine Aussage erforderlich ist, die sich von einer Zeile unterscheidet.
SuperBiasedMan