Non*_*mus 5 python grammar abstract-syntax-tree asdl
例如,如果我要创建一个名为“Something”的节点,我想在 Python AST 树中使用它,那么我必须在 Python 源代码中添加哪些更改以及哪些更改才能做到这一点?
我知道我应该从定义 AST 语法的 Python.asdl 开始。然后我应该转向 ast.c。
不幸的是,我不确定我到底需要在 ast.c 文件中进行哪些更改才能实现该节点。
另外,为了简单起见,假设我只想将节点作为占位符,这意味着它除了能够将自身插入到树中之外不应该执行任何操作。
还不需要深入研究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)
Run Code Online (Sandbox Code Playgroud)
ast.NodeTransformerast.NodeTransformer如果您想转换现有的 AST,请查看该类。
以下是上述博客文章中的示例,该示例修改要在前面加上 的字符串值str:。
class MyTransformer(ast.NodeTransformer):
def visit_Str(self, node):
return ast.Str('str: ' + node.s)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2365 次 |
| 最近记录: |