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



例如,如果我要创建一个名为"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)

最新更新