Python ast.BoolOp何时有两个以上的值?
Python的AST使用Python ast.BoolOp何时有两个以上的值?,python,python-2.7,Python,Python 2.7,Python的AST使用 BoolOp(boolop op, expr* values) 我希望它类似于BinOp,具有左和右值 有人能给我一个示例代码,其中AST将有许多不同于两个的值吗 编辑: 显然,x和y以及z会产生三个值。因此,让我重新措辞: 为什么不将其建模为两个嵌套的BoolOp表达式?a和b以及c被Python解析器视为三元连词: >>> e = ast.parse('''a and b and c''').body[0].value >>>
BoolOp(boolop op, expr* values)
我希望它类似于BinOp
,具有左
和右
值
有人能给我一个示例代码,其中AST将有许多不同于两个的值吗
编辑:
显然,x和y以及z
会产生三个值。因此,让我重新措辞:
为什么不将其建模为两个嵌套的
BoolOp
表达式?a和b以及c
被Python解析器视为三元连词:
>>> e = ast.parse('''a and b and c''').body[0].value
>>> e.op
<_ast.And object at 0x254d1d0>
>>> e.values
[<_ast.Name object at 0x2d9ba50>, <_ast.Name object at 0x2d9ba90>, <_ast.Name object at 0x2d9bad0>]
布尔运算符必须是特殊情况,因为有快捷方式;当评估
A和B以及C
时,如果A
为False
,B
和C
将不会评估。它们的评估方式与BinOp不同,当然。但是A和B和C
可以被视为A和(B和C)
而不改变这一点。我认为OP得到了这一点,并问为什么,因为这使得BoolOp
不同于BinOp
(因此可以说违反了简单性规则)。A和B和C
的行为是否与A和(B和C)有所不同
?@割草机:完全没有。这可能是一个优化,请给我一点时间阅读grep
CPython源代码。非常感谢!使用dis
是个好主意。我得记住这一点。
>>> ast.parse('''a and (b and c)''').body[0].value.values
[<_ast.Name object at 0x2d9b990>, <_ast.BoolOp object at 0x2d9bb10>]
>>> def f(a, b, c):
... return a and b and c
...
>>> def g(a, b, c):
... return a and (b and c)
...
>>> from dis import dis
>>> dis(f)
2 0 LOAD_FAST 0 (a)
3 JUMP_IF_FALSE_OR_POP 15
6 LOAD_FAST 1 (b)
9 JUMP_IF_FALSE_OR_POP 15
12 LOAD_FAST 2 (c)
>> 15 RETURN_VALUE
>>> dis(g)
2 0 LOAD_FAST 0 (a)
3 JUMP_IF_FALSE_OR_POP 15
6 LOAD_FAST 1 (b)
9 JUMP_IF_FALSE_OR_POP 15
12 LOAD_FAST 2 (c)
>> 15 RETURN_VALUE