为什么这在Python中不是语法错误?

54 投票
3 回答
2455 浏览
提问于 2025-04-18 08:17

今天在我们的代码里发现了一行代码,我本以为这肯定会因为语法错误而导致构建失败,但测试却通过了,所以显然这在 Python 中是有效的(无论是 2.x 还是 3.x 版本)。

在条件表达式中,有时候不需要空格:

>>> 1if True else 0
1

如果左边是一个变量,这种写法就不行:

>>> x = 1
>>> xif True else 0
  File "<stdin>", line 1
    xif True else 0
           ^
SyntaxError: invalid syntax

但对于其他类型的字面量,这种写法似乎还是可以用的:

>>> {'hello'}if False else 'potato'
'potato'

这到底是怎么回事?这是语法的一部分吗?这个奇怪的现象是大家都知道的吗?

3 个回答

3

根据我对词法处理和分词的有限了解,我觉得你看到的情况是,任何可以被词法解析为“不同”的部分(比如数字、字典等等)都被处理了。大多数编程语言会忽略空格,我想Python也是这样做的(当然,缩进的层级除外)。一旦生成了这些“标记”,语法本身就不再关心空格了,它主要是寻找一个像 [表达式] [如果] [表达式] [否则] [表达式] 这样的结构,而根据你的例子,这样的结构是完全可以工作的。

4

Python的词法分析器会把输入的1if分成两个部分:一个是数字1,另一个是关键字if。这是因为任何以数字开头的部分都不能包含if这个字符串。而xif则被认为是一个有效的标识符;没有理由认为它是一个标识符后面跟着一个关键字,所以它会作为一个整体传给解析器。

66

标记之间的空白

除了在逻辑行的开头或字符串字面量中,空白字符(空格、制表符和换页符)可以互换使用来分隔标记。只有当两个标记的连接可能被解释为不同的标记时,才需要在它们之间留出空白(例如,ab是一个标记,但a b是两个标记)。

所以在这种情况下,1if 不是一个有效的标记,因此空白是可选的。这里的 1 被解释为一个整数,而 if 则被单独理解为一个关键字,并不属于这个整数的一部分。

但是在 xif 中,Python会把它识别为一个标识符,所以它无法理解你想写的是 x if

撰写回答