为什么这在Python中不是语法错误?
今天在我们的代码里发现了一行代码,我本以为这肯定会因为语法错误而导致构建失败,但测试却通过了,所以显然这在 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
。