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 +错误?
我知道这是在编译过程中处理的,但它是如何工作的?
使用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)
如果操作数之间有多个运算符,那么它将起作用如下
3 +++ 5 # it will work as 3 + ( + ( +5) )
Run Code Online (Sandbox Code Playgroud)
希望它能清除你的怀疑.