我想不仅将 NodeTransformer 应用于当前文件的 AST,而且还应用于导入的任何代码。如果运行下面的代码,您会注意到转换器可以工作,但仅适用于读取和解析的单个文件。我将如何修改此代码以将转换器应用于解析代码中的任何导入?
a.py:
from b import q
def r(a):
return q(a) + 5
b.py:
def q(n):
return r(n + 1)
def r(n):
return n
Main.py:
import ast
import astor
class trivial_transformer(ast.NodeTransformer):
def visit_FunctionDef(self, node):
body = []
for line in node.body:
body.append(
ast.Expr(
ast.Call(func=ast.Name('print', ctx=ast.Load()),
args=[ast.Str(s="Doing: "+astor.to_source(line).strip())],
keywords=[])))
body.append(self.generic_visit(line))
node.body = body
return node
parsed_ast = ast.fix_missing_locations(trivial_transformer().visit(ast.parse(open('a.py','r').read())))
g = {}
eval(compile(parsed_ast, '<source>', 'exec'), g)
print(g['r'](5))
这产生:
Doing: return q(a) + 5
11
但我希望它能产生:
Doing: return q(a) + 5
Doing: return r(n + 1)
Doing: return n
11
catspeake
相关分类