54

今天注意到我们代码库中的一行,我认为肯定会因为语法错误而导致构建失败,但测试通过了,所以显然它实际上是有效的 python(在 2.x 和 3 中)。

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

>>> 1if True else 0
1

如果 LHS 是一个变量,它就不起作用:

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

但它似乎仍然适用于其他类型的文字:

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

这里发生了什么,出于某种原因,它是否有意成为语法的一部分?这个奇怪的怪癖是已知的/记录在案的行为吗?

4

3 回答 3

66

标记之间的空格

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

所以在这种情况下,1if不是一个有效的令牌,所以空格是可选的。The被解释为不是其一部分1的整数文字。if所以if单独解释并识别为关键字。

然而xif,一个标识符被识别,所以 Python 无法看到你想要在那里做的事情x if

于 2014-06-02T15:27:21.270 回答
4

Python 词法分析器为输入生成两个标记1if:整数1和关键字if,因为以数字开头的标记不能包含字符串ifxif另一方面,被识别为有效标识符;没有理由相信它是一个标识符后跟一个关键字,因此作为单个标记传递给解析器。

于 2014-06-02T15:27:50.417 回答
3

由于我对词汇处理和标记化的了解有限,我想说你所看到的是任何可以被词汇解析为“不同”(即数字/字典等)的片段if都在这样做。大多数语言都会忽略空格,我想 Python 也会这样做(当然不包括缩进级别)。生成标记后,语法本身并不关心,它很可能会寻找一个[EXPRESSION] [IF] [EXPRESSION] [ELSE] [EXPRESSION]分组,再次使用您的示例,它可以正常工作。

于 2014-06-02T15:27:39.113 回答