Python中如何程序化获取函数的上游调用栈以调试代码?
程序化识别Python函数调用栈并输出指定格式
要实现自动识别函数调用栈并输出层级化的调用记录(包含实际传入的参数值),可以通过装饰器结合参数捕获的方式实现,以下是具体方案:
示例代码
def func(x): return func2(x+4) def func2(x): return x*3 func(5)
期望输出
func(5) - func2(9)
实现代码
# 存储调用栈的全局列表 call_stack = [] def track_call(func): def wrapper(*args, **kwargs): # 格式化位置参数 args_repr = [repr(arg) for arg in args] # 格式化关键字参数 kwargs_repr = [f"{k}={repr(v)}" for k, v in kwargs.items()] # 拼接完整参数字符串 full_args = ", ".join(args_repr + kwargs_repr) # 生成调用记录 call_record = f"{func.__name__}({full_args})" call_stack.append(call_record) try: # 执行原函数 return func(*args, **kwargs) finally: # 函数执行完毕后从栈中移除当前记录 call_stack.pop() # 当最外层函数执行完成时,输出完整调用栈 if not call_stack: print(call_stack[0]) for entry in call_stack[1:]: print(f"- {entry}") return wrapper # 为需要追踪的函数添加装饰器 @track_call def func(x): return func2(x+4) @track_call def func2(x): return x*3 # 执行函数 func(5)
说明
- 装饰器
track_call会在每次函数调用时,捕获实际传入的位置参数和关键字参数,生成带参数的调用记录并加入调用栈。 - 函数执行完毕后从栈中移除当前记录,当最外层函数执行完成(调用栈为空时),按照层级格式输出所有调用记录。
- 该方案仅追踪添加了装饰器的函数,若需要全局追踪所有函数调用,可以改用
sys.settrace实现更细粒度的追踪。
内容的提问来源于stack exchange,提问作者Roshan Santhosh
相关产品推荐
相关产品推荐

