我喜欢 _ast 模块提供的选项,它真的很强大。有没有办法从中获取完整的 AST?
例如,如果我得到以下代码的 AST:
import os
os.listdir(".")
通过使用:
ast = compile(source_string,"<string>","exec",_ast.PyCF_ONLY_AST)
ast 对象的主体将包含两个元素,一个import 对象和一个expr 对象。但是,我想更进一步,获取import和listdir的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/