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

5 投票
1 回答
2379 浏览
提问于 2025-04-17 12:33

比如说,如果我想创建一个叫“Something”的节点,并且想在Python的抽象语法树(AST)中使用它,我需要在Python的源代码中做哪些改动呢?

我知道我应该从Python.asdl开始,因为那里定义了AST的语法规则。接下来,我需要去看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)

撰写回答