4

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

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

不幸的是,我不确定我必须在 ast.c 文件中的哪个位置进行更改才能实现该节点。

此外,为简单起见,假设我只希望节点作为占位符,这意味着它不应该做任何事情,除了能够将自己插入树中。

4

1 回答 1

1

还没有必要潜入Python.asdl!然后你必须四处寻找一个 ASDL 解析器,然后你必须弄清楚如何处理它(尽管这本身就是一个值得练习的练习)。多亏了令人惊叹的ast模块,您可以留在 Python 中。

请务必查看 Eli Bendersky关于此事的文章

这是他提供的一个示例,其中构建并eval从头开始构建 AST!

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.NodeTransformer如果您想转换现有的 AST,请查看该课程。

这是上述博客文章中的一个示例,该示例修改了要以 . 开头的字符串值str:

class MyTransformer(ast.NodeTransformer):
    def visit_Str(self, node):
        return ast.Str('str: ' + node.s)
于 2012-02-08T09:48:36.623 回答