我正在使用python 2.7中的compiler
模块从python程序中获取抽象语法树,我想用自己的节点扩展AST节点集。
例如,给定python程序1+2
,在解析时,从compiler
模块输出的AST输出:
解析程序:
import compiler
ast = compiler.parse("1+2")
print ast
输出:
Module(None, Stmt([Discard(Add((Const(1), Const(2))))]))
现在,我希望用布尔节点扩展AST库。目前,compiler
模块将True
,False
分配为Name()
个节点。即compiler.parse("True")
输出Module(None, Stmt([Discard(Name('True'))]))
我的计划是构造一个名为Bool
的类,并使用布尔值包装节点,剥离那些Name()
节点并使用我的Bool
节点。我的Bool定义。
class Bool():
def __init__(self,expr):
self.expr = expr
问题,现在打印ast时,正确替换后,它不会以与其他节点类似的样式打印。相反,它给出了
compiler.parse("True")
输出
Module(None, Stmt([Discard(<Bool instance at 0x10e4306c8>)]))
相反,我可以使用什么做法以类似于Bool
模块的方式打印那些compiler
节点?例如欲望:
Module(None, Stmt([Discard(Bool('True'))]))