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

注意到今天我们的代码库中的一行,我认为肯定会有语法错误的构build失败,但testing传递显然是实际上有效的Python(在2.x和3)。

有时在条件expression式中不需要空格:

>>> 1if True else 0 1 

如果LHS是一个variables,它不起作用:

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

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

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

这里发生了什么,是故意出于某种原因的语法的一部分? 这种奇怪的怪癖是已知的/记载的行为?

令牌之间的空格

除了在逻辑行开头或string文字开头,空白字符空格,制表符和换页符可以交替使用以分隔标记。 仅当两个令牌之间的连接可能被解释为不同的令牌(例如,ab是一个令牌,但ab是两个令牌)时,两个令牌之间才需要空白。

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

然而,在xif中,标识符被识别,所以如果Python没有看到你想要做x if

Python词法分析器为input1if生成两个标记:整数1和关键字if ,因为没有以数字开头的标记可以包含stringif 。 另一方面, xif被认为是有效的标识符; 没有理由相信它是一个标识符后跟一个关键字,所以作为单个标记传递给parsing器。

由于我对词汇处理和标记化的知识有限,我会说你看到的是,任何可以被parsing为“不同”(即数字/字典等)的词汇都是从这个词汇中parsing出来的。 大多数语言都会忽略空格,我想Python也是一样的(当然不包括缩进级别)。 一旦生成了令牌,语法本身并不在意,它很可能会查找[EXPRESSION] [IF] [EXPRESSION] [ELSE] [EXPRESSION]分组,这与您的示例一样可以正常工作。