【发布时间】:2009-07-14 21:43:02
【问题描述】:
我喜欢 _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 和其他可能为其执行的函数调用。
【问题讨论】:
-
请记住,除非您的 Python 代码遵循几个约定,否则您必须实际执行代码才能找出在代码中的某个点使用了哪个模块/函数。跨度>
-
那么我该怎么做呢?
-
你不能,一般来说。你可以有类似的东西: import os;随机导入;如果 random.random() > .5: os.listdir = lambda *args: None; os.listdir(".");然后要弄清楚执行了哪些代码会有点棘手。但即使是方法调用也很棘手,因为您必须静态重建类层次结构和 mro。
标签: python abstract-syntax-tree