运行python时,有一个基于
的解释问题>>> 5 > 25 == False
False
>>> (5 > 25) == False
True
由于这是一个关于操作顺序的问题,我想实际看看python解释器实际上如何处理这两个语句。有没有办法这样做?
答案 0 :(得分:3)
ast
模块可以显示表达式或语句的抽象语法树:
>>> import ast
>>> ast.dump(ast.parse('5 > 25 == False'))
'Module(body=[Expr(value=Compare(left=Num(n=5), ops=[Gt(), Eq()], comparators=[Num(n=25), NameConsta
nt(value=False)]))])'
>>> ast.dump(ast.parse('(5 > 25) == False'))
'Module(body=[Expr(value=Compare(left=Compare(left=Num(n=5), ops=[Gt()], comparators=[Num(n=25)]), o
ps=[Eq()], comparators=[NameConstant(value=False)]))])'
dis
模块可以显示字节码:
>>> import dis
>>> dis.dis('5 > 25 == False')
1 0 LOAD_CONST 0 (5)
3 LOAD_CONST 1 (25)
6 DUP_TOP
7 ROT_THREE
8 COMPARE_OP 4 (>)
11 JUMP_IF_FALSE_OR_POP 21
14 LOAD_CONST 2 (False)
17 COMPARE_OP 2 (==)
20 RETURN_VALUE
>> 21 ROT_TWO
22 POP_TOP
23 RETURN_VALUE
>>> dis.dis('(5 > 25) == False')
1 0 LOAD_CONST 0 (5)
3 LOAD_CONST 1 (25)
6 COMPARE_OP 4 (>)
9 LOAD_CONST 2 (False)
12 COMPARE_OP 2 (==)
15 RETURN_VALUE
dis
也可以对存储在函数中的已编译字节码进行操作,也可以作为python3 -m dis
的独立实用程序进行操作。
将字符串传递给dis.dis()
是Python 3中的新功能;以下是调用此函数的一些等效方法:
>>> dis.dis(lambda: 5 > 25 == False)
>>> dis.dis(compile('5 > 25 == False', '', 'eval'))
答案 1 :(得分:1)
您可以使用ast
模块来解析表达式。生成的解析树应该提供关于如何计算表达式的线索。