15

为什么有时可以在关键字前后省略空格?例如,为什么表达式2if-1e1else 1有效?

似乎适用于 CPython 2.7 和 3.3:

$ python2
Python 2.7.3 (default, Nov 12 2012, 09:50:25) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 2if-1e1else 1
2

$ python3
Python 3.3.0 (default, Nov 12 2012, 10:01:55) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 2if-1e1else 1
2

甚至在 PyPy 中:

$ pypy
Python 2.7.2 (341e1e3821ff, Jun 07 2012, 15:42:54)
[PyPy 1.9.0 with GCC 4.2.1] on darwin
Type "help", "copyright", "credits" or "license" for more information.
And now for something completely different: ``PyPy 1.6 released!''
>>>> 2if-1e1else 1
2
4

1 回答 1

12

python中的标识符描述为:

identifier ::= (letter|"_") (letter | digit | "_")* 

因此,2if不能是标识符,因此 if 必须是2, if。类似的逻辑适用于表达式的其余部分。

基本上解释2if-1e1else 1会是这样的(完整的解析会很复杂):

2if无效的标识符,2匹配 digit digit ::= "0"..."9"if匹配关键字。 -1e1else,是:-1的一元否定 ( u_expr ::= power | "-" u_expr | "+" u_expr | "~" u_expr) (匹配in ,是指数。)您可以看到以下形式的表达式产生一个浮点数:1intpartexponentfloat ::= (intpart | pointfloat) | exponente1exponent ::= ("e" | "E") ["+" | "-"] digit+Ne+|-x

>>> type(2e3)
<type 'float'>

然后 theelse被视为关键字,-1等等。

您可以仔细阅读gammar以了解更多信息。

于 2013-05-14T05:03:22.753 回答