如何修改Python源码以添加新AST节点?
比如说,如果我想创建一个叫“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)