You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:08:24