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