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

5
例如,如果我想创建一个名为“Something”的节点,并希望在Python AST树中使用它,我需要在Python源代码中添加哪些更改?我知道应该从定义AST语法的Python.asdl开始。然后我应该转到ast.c。不幸的是,我不确定我需要在ast.c文件的哪个位置进行更改才能实现该节点。另外,为了简单起见,假设我只想将该节点作为占位符,这意味着它除了能够插入到树中之外不执行任何操作。
1个回答

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)

ast.NodeTransformer

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

以下是来自上述博客文章的示例,它将修改字符串值以在前面加上str:

class MyTransformer(ast.NodeTransformer):
    def visit_Str(self, node):
        return ast.Str('str: ' + node.s)

1
我熟悉Eli Bendersky关于这个问题的文章;然而,它处理的是与我所讨论的不同领域。我希望实际上将一种新类型的节点添加到其中。例如,有ast.Str(s),我想使其成为ast.Undefined()。 - Nonomus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接