为什么在Python中使用双分号作为SyntaxError?

时间:2016-03-20 09:07:56

标签: python syntax-error language-lawyer

我知道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。我以为分号之间的陈述被视为一个空行,一个无操作。显然不是。

为什么这是一个错误?

2 个答案:

答案 0 :(得分:104)

从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

答案 1 :(得分:23)

空语句仍然需要Rational Rational::operator-(Rational num) { Rational tmp[3]; tmp[0] = multFraction(num); tmp[1] = num.multFraction(*this); tmp[2].mone = tmp[0].mone - tmp[1].mone; tmp[2].mechane = tmp[0].mechane; if (checNumber(tmp[2])) { string printOne = tmp[2].mone; return printOne; } return reducingNumber(tmp[2]); } ,即使你有分号。

pass