如何修改Python源代码以添加新的AST节点?

Non*_*mus 5 python grammar abstract-syntax-tree asdl

例如,如果我要创建一个名为“Something”的节点,我想在 Python AST 树中使用它,那么我必须在 Python 源代码中添加哪些更改以及哪些更改才能做到这一点?

我知道我应该从定义 AST 语法的 Python.asdl 开始。然后我应该转向 ast.c。

不幸的是,我不确定我到底需要在 ast.c 文件中进行哪些更改才能实现该节点。

另外,为了简单起见,假设我只想将节点作为占位符,这意味着它除了能够将自身插入到树中之外不应该执行任何操作。

mva*_*een 2

还不需要深入研究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)
Run Code Online (Sandbox Code Playgroud)

ast.NodeTransformer

ast.NodeTransformer如果您想转换现有的 AST,请查看该类。

以下是上述博客文章中的示例,该示例修改要在前面加上 的字符串值str:

class MyTransformer(ast.NodeTransformer):
    def visit_Str(self, node):
        return ast.Str('str: ' + node.s)
Run Code Online (Sandbox Code Playgroud)