例如,如果我想创建一个名为“Something”的节点,并希望在Python AST树中使用它,我需要在Python源代码中添加哪些更改?我知道应该从定义AST语法的Python.asdl开始。然后我应该转到ast.c。不幸的是,我不确定我需要在ast.c文件的哪个位置进行更改才能实现该节点。另外,为了简单起见,假设我只想将该节点作为占位符,这意味着它除了能够插入到树中之外不执行任何操作。
现在不需要深入研究 Python.asdl
!然后你必须四处寻找ASDL解析器,然后你必须弄清楚该怎么做(虽然这本身就是一个有价值的练习)。由于惊人的ast
模块,你可以留在Python内部。
一定要查看Eli Bendersky关于此事的文章。
这里是他提供的一个例子,其中构建了一个AST并从头开始进行了eval
!
import ast
node = ast.Expression(ast.BinOp(
ast.Str('xy'),
ast.Mult(),
ast.Num(3)))
fixed = ast.fix_missing_locations(node)
codeobj = compile(fixed, '<string>', 'eval')
print eval(codeobj)
ast.NodeTransformer
如果您想要转换现有的AST,请查看ast.NodeTransformer
类。
以下是来自上述博客文章的示例,它将修改字符串值以在前面加上str:
。
class MyTransformer(ast.NodeTransformer):
def visit_Str(self, node):
return ast.Str('str: ' + node.s)