例如,如果我要创建一个名为"Something"的节点,我想在Python AST树中使用它,为了做到这一点,我必须在哪里以及哪些更改添加到Python源代码中?
我知道我应该从定义AST语法的Python.asdl开始。然后我应该转到ast。c.
不幸的是,我不确定为了实现节点,我必须在ast.c文件中的哪些地方进行更改。
此外,为了简单起见,假设我只希望节点作为占位符,这意味着它除了能够将自己插入到树中之外,不应该做任何事情。
还不需要深入研究Python.asdl
!然后,你必须四处寻找一个ASDL解析器,然后你必须弄清楚该如何使用它(尽管这本身就是一个有价值的练习)。得益于令人惊叹的ast
模块,您可以留在Python中。
请务必查看Eli Bendersky关于此事的文章。
下面是他提供的一个例子,其中构造了AST并从头开始eval
'd!
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
类。
下面是上面博客文章中的一个例子,它将字符串值修改为以CCD_ 6预处理。
class MyTransformer(ast.NodeTransformer):
def visit_Str(self, node):
return ast.Str('str: ' + node.s)