python - 如何在 Python 中获得完整的 AST?

标签 python abstract-syntax-tree

我喜欢 _ast 模块提供的选项,它真的很强大。有没有办法从中获取完整的 AST?

例如,如果我得到以下代码的 AST:

import os
os.listdir(".")

通过使用:

ast = compile(source_string,"<string>","exec",_ast.PyCF_ONLY_AST)

ast 对象的主体将包含两个元素,一个import 对象和一个expr 对象。但是,我想更进一步,获取importlistdir的AST,换句话说,我想制作_ast 尽可能降到最低层。

我认为这种事情应该是可能的,这是合乎逻辑的。问题是如何

编辑:在可能的最低级别,我并不是说访问“可见”的内容。我也想获得用于实现 listdir 的 AST:例如 stat 和可能为其执行的其他函数调用。

最佳答案

您确实以这种方式获得整棵树——一直到底部——但是,它作为一棵树保存,确切地说……所以在每个级别上,为了获得子级,您必须明确访问所需的属性.例如(我将 compile 结果命名为 cf 而不是 ast 因为那会隐藏标准库 ast 模块——我假设你只有 2.5 而不是 2.6,这就是为什么你使用较低级别的 _ast 模块来代替?)...:

>>> cf.body[0].names[0].name
'os'

这就是告诉您 import 语句正在导入名称 os(而那个只是因为 1 是 .names 字段的长度。 body[0]import).

在 Python 2.6 的模块 ast 中,您还可以获得助手,让您更轻松地在树上导航(例如通过 Visitor 设计模式)——但整个树存在于 2.5(使用 _ast)或 2.5(使用 ast)中,并且在任何一种情况下都以完全相同的方式表示。

为了方便地访问树中的所有节点,在 2.6 中,使用模块 ast(无前导下划线)和子类 ast.NodeVisitor(或等效地使用 ast.iter_child_nodes 递归和 ast.iter_fields 根据需要)。当然,如果您出于某种原因被困在 2.5 中,则可以在 _ast 之上用纯 Python 实现这些助手。

关于python - 如何在 Python 中获得完整的 AST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1128234/

相关文章:

python - numpy 中的选择性行和矩阵

python - Django:实现多个用户级别/角色/类型

python - Seaborn 直方图 bin 宽度未扩展到 bin 标签

python - 如何在滚动时保持小部件在 View 中?

syntax - 为什么我不能在 Groovy 脚本中的 @Grab 声明之后进行方法调用?

java - 如何在不知道有多少个元素的情况下将列表中的所有元素添加到抽象语法树?

c# - 如何在 C# 中为抽象语法树编写访问者模式?

Python DEAP 个体到 AST

hash - 如何缓存 AST 的哈希码?

python - Python click 库中急切选项的非交互式确认