Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ast.BoolOp何时有两个以上的值?_Python_Python 2.7 - Fatal编程技术网

Python ast.BoolOp何时有两个以上的值?

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 >>>

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
>>> 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