python ast NodeTransformer 代码插桩
import ast, astor, inspect
# 测试函数
def test_func(a,b):
d = a + 2
f = b + 5
o = d + f
return o
# 代码转换pass
class dump_trans(ast.NodeTransformer):
def visit_Assign(self, node):
dump_code = "print({})".format(node.targets[0].id)
dump_node = ast.parse(dump_code).body[0]
return node, dump_node
# 获取原函数ast
tast = ast.parse(inspect.getsource(test_func)).body[0]
# 进行代码插入
dt = dump_trans()
ntast = dt.visit(tast)
# ast 转换成 源代码 str
new_code = astor.to_source(ntast)
print(new_code)
'''
def test_func(a,b):
d = a + 2
print(d)
f = b + 5
print(f)
o = d + f
print(o)
return o
'''
# 执行新代码 编译 生成 新函数对象
local={}
exec(new_code, {}, local)
print(local)
new_f = local["test_func"]
# 执行新函数
new_f(6, 9.0)
# 会有打印信息