首页 > 解决方案 > 访问调用函数的 vars()

问题描述

调试时,我经常发现打印变量的名称和内容很有用。

a = 5
b = 7
print("a: "+str(a)+"\n b: "+str(b))

我想写一个函数来实现这一点。到目前为止,我有以下功能:

def dprint(varslist, *varnames):
    string = [var+": "+str(varslist[var]) for var in varnames]
    print("\n".join(string))

它的使用示例是

a = 5
b = 7
dprint(vars(), "a", "b")

我的问题是:有没有什么方法可以写出dprint()不需要vars()每次调用时都明确传递给它的方法?具体来说,有没有办法dprint()访问它的调用函数vars()

然后,我们可以将其重写为

def dprint(*varnames):
    varslist = # magic code that gets vars() from calling function
    string = [var+": "+str(varslist[var]) for var in varnames]
    print("\n".join(string))

标签: pythondebugging

解决方案


使用sys._getframe

从调用堆栈返回一个框架对象。如果给定了可选的整数深度,则返回堆栈顶部以下多次调用的框架对象。如果这比调用堆栈更深,则会引发 ValueError。深度的默认值为零,返回调用堆栈顶部的帧。

然后用于f_locals获取caller.

import sys

def dprint(*varnames):
    caller = sys._getframe(1)  # depth=1
    for var in varnames:
        print(f'{var}: {caller.f_locals.get(var)}')

def foo():
    a = 5
    b = 7
    dprint("a", "b")

foo()

输出:

a: 5
b: 7

推荐阅读