import inspectimport importlibimport astclass imports(ast.NodeVisitor): def visit_import(self, node): print("In import") for imp in node.names: if imp.asname is not None: print("module name = {}, alias = {}".format(imp.name, imp.asname)) else: print("module name = {}".format(imp.name)) print() def visit_importFrom(self, node): print("In importFrom") for imp in node.names: if imp.asname is not None: print("module = {}nname = {}nalias = {}nlevel = {}n".format(node.module, imp.name, imp.asname, node.level)) else: print("module = {}nname = {}nlevel = {}n".format(node.module, imp.name, node.level)) print()mod = "temp_test"mod = importlib.import_module(mod)p = ast.parse(inspect.getsource(mod))imports().visit(p)输入:
from bisect import bisect_left as bsimport datetimeimport timeimport numpy as npdef foo(): from re import findallclass Foo(): def test(self): from re import compile as cp, finditer as ft
输出:
In importFrommodule = bisectname = bisect_leftalias = bslevel = 0In importmodule name = datetimeIn importmodule name = timeIn importmodule name = numpy, alias = npIn importFrommodule = rename = findalllevel = 0In importFrommodule = rename = compilealias = cplevel = 0module = rename = finditeralias = ftlevel = 0
类import(名称)
导入声明。名称是别名节点的列表。
importFrom类(模块,名称,级别)
从x导入y表示。module是“
from”名称的原始字符串,没有任何前导点,对于诸如from的语句则为None。导入foo。level是一个保持相对导入级别的整数(0表示绝对导入)。
该greentreesnakes至少文档,我有什么样的所有节点做一个更好的解释,以及如何使用AST模块比实际AST文档本身。
您还可以使用直接传递模块或打开py文件并将内容传递给ast.parse:
with open("temp_test.py") as f: p = ast.parse(f.read(), filename="<ast>", mode="exec")imports().visit(p)并传递模块:
import temp_testp = ast.parse(inspect.getsource(temp_test))imports().visit(p)



