今天在我们的代码库中注意到一行,我认为肯定会因为语法错误而无法构建,但是测试正在通过,所以显然它实际上是有效的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'
这里发生了什么,它是出于某种原因故意成为语法的一部分吗?这个奇怪的怪癖是一种已知/记录的行为吗?
答案 0 :(得分:63)
Whitespace between tokens
除了在逻辑行的开头或字符串文字中,空白字符空格,制表符和换页符可以互换使用以分隔标记。只有当两个令牌的串联被解释为不同的令牌时才需要空格(例如,ab是一个令牌,但b是两个令牌)。
因此,在这种情况下,1if
不是有效的标记,因此空格是可选的。 1
被解释为整数文字,其中if
不是其中的一部分。因此,if
会被单独解释并被识别为关键字。
然而,在xif
中,识别出一个标识符,因此Python无法在那里看到您想要x if
。
答案 1 :(得分:4)
Python词法分析器为输入1if
生成两个标记:整数1
和关键字if
,因为没有以数字开头的标记可以包含字符串{{1} }。另一方面,if
被认为是有效的标识符;没有理由相信它是一个后跟关键字的标识符,因此作为单个标记传递给解析器。
答案 2 :(得分:3)
由于我对词汇处理和标记化的了解有限,我会说你所看到的是任何可以从{{1}词法解析为“不同”(即数字/字典等等)的作品。正在这样做。大多数语言都忽略了空格,我想Python也是如此(当然不包括缩进级别)。一旦生成了令牌,语法本身并不关心,它很可能会寻找if
分组,再次使用您的示例,它将正常工作。