为什么这不是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]
分组,这与您的示例一样可以正常工作。