有没有办法在python中显示如何解释一条线?

时间:2016-10-21 14:36:55

标签: python

运行python时,有一个基于

的解释问题
>>> 5 > 25 == False
False
>>> (5 > 25) == False
True

由于这是一个关于操作顺序的问题,我想实际看看python解释器实际上如何处理这两个语句。有没有办法这样做?

2 个答案:

答案 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模块来解析表达式。生成的解析树应该提供关于如何计算表达式的线索。