假定我们从其他地方得到了一个func, 现在想知道这个func中的local variable的信息(k-v对),可以使用frame.f_locals达到目的。
首先需要定义wrapper函数,标注@wraps(func),func为原始的函数,之后定义tracer,用于获取locals(),在函数执行前通过sys.setprofile(tracer)使tracer函数生效即可(这个过程可能会对性能有影响,当递归次数较多时尤甚,需要结合使用场景验证)。
整体过程代码如下:
def main_func_here(func: Callable, *args, **kwargs):
locals_data = {}
@wraps(func)
def wrapper(*args, **kwargs):
def tracer(frame, event, arg):
if event != 'return':
return
nonlocal locals_data
locals_data = frame.f_locals.copy()
original_profiler = sys.getprofile()
sys.setprofile(tracer)
func(*args, **kwargs)
sys.setprofile(original_profiler)
print(locals_data)