为什么3 +++ 5适用于Python

Leo*_*ell 5 python evaluation

In [476]: 3 + 5
Out[476]: 8

In [477]: 3 +++++++++++++++++++++ 5
Out[477]: 8

In [478]: 3 + + + + + + + + + + + 5
Out[478]: 8

In [479]: 3 +++ --- +++ --- +++ 5
Out[479]: 8
Run Code Online (Sandbox Code Playgroud)

为什么没有SyntaxError: invalid syntax或有TypeError: bad operand type for unary +错误?

我知道这是在编译过程中处理的,但它是如何工作的?

jsa*_*nen 6

使用ast模块我们可以创建抽象语法树表示,看看会发生什么:

import ast
source = 'ADD SOURCE HERE'
node = ast.parse(source, mode='eval')
ast.dump(node, False, False)
Run Code Online (Sandbox Code Playgroud)

在这种情况下3 +++ 5,AST生成以下表达式:

'Expression(BinOp(Num(1), Add(), UnaryOp(UAdd(), UnaryOp(UAdd(), Num(2)))))'
Run Code Online (Sandbox Code Playgroud)

或者例如3 ++ -- 5产生:

'Expression(BinOp(Num(3), Add(), UnaryOp(UAdd(), UnaryOp(USub(), Num(-5)))))'
Run Code Online (Sandbox Code Playgroud)

  • @zmbq是的,确实如此.反汇编显示多次调用`UNARY_NEGATIVE`. (2认同)

Jay*_*ikh 5

如果操作数之间有多个运算符,那么它将起作用如下

3 +++ 5  # it will work as 3 + ( + ( +5) )
Run Code Online (Sandbox Code Playgroud)

希望它能清除你的怀疑.

  • 值得一提的是,`3 - 5`产生'8`,而`3 --- 5`是'-2`,所以显然一元运算符`+`和`-`完全按预期工作. (2认同)