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

wim*_*wim 52 python grammar conditional-expressions

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

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

>>> 1if True else 0
1
Run Code Online (Sandbox Code Playgroud)

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

>>> x = 1
>>> xif True else 0
  File "<stdin>", line 1
    xif True else 0
           ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

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

>>> {'hello'}if False else 'potato'
'potato'
Run Code Online (Sandbox Code Playgroud)

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

pok*_*oke 63

令牌之间有空格

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

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

xif但是,标识符是公认的,所以Python是不是能看到你想做的事x if那里.

  • @wim我迷茫了一会儿,并认为它应该解析,但是`1e`实际上被解释为科学记谱法中文字的开头; 例如`1e3 == 1000` (32认同)
  • 有趣!阅读完评论后,我注意到`1 if 1jelse 0`_does_ parse. (7认同)
  • 根据这个推理,不应该`1 if1else 0`解析?(它没有) (4认同)
  • @wim:或者`1 if 0b1else 0`."1else"没有解析的事实表明,这个答案中引用的规则与实现并不完全一致,因为`1else`不能被解释为不同的令牌,也不能解释为'1e`.(`0x1else`也不解析,但那是因为最大的munch规则使它成为`0x1e``lse`,两者都是有效的.) (4认同)