Python自定义调试打印函数如何无需显式传参获取调用方的vars()
优化实现方案
可以通过Python标准库inspect模块读取调用栈的上层帧对象,直接获取调用方的局部变量集合,无需手动传入vars(),最终实现代码如下:
import inspect def dprint(*varnames): # 获取调用当前函数的上层栈帧 caller_frame = inspect.currentframe().f_back # 栈帧的f_locals属性等价于调用方执行时的vars()返回值 varslist = caller_frame.f_locals # 兼容不存在的变量可选写法:用get避免KeyError string = [f"{var}: {varslist.get(var, '<变量未定义>')}" for var in varnames] print("\n".join(string)) # 手动释放帧对象,避免循环引用导致内存泄漏 del caller_frame
调用示例
a = 5 b = 7 dprint("a", "b")
输出效果:
a: 5 b: 7
补充说明
- 若需要同时支持查找全局变量,可将
varslist替换为{**caller_frame.f_globals, **caller_frame.f_locals},优先级为局部变量覆盖全局变量 - 栈帧操作属于Python解释器内部特性,仅建议调试场景使用,不要在生产环境核心逻辑中引入
- 上述实现兼容所有主流Python3版本
内容的提问来源于stack exchange,提问作者8l2s
相关产品推荐
相关产品推荐

