python - 访问调用函数的 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))
解决方案
从调用堆栈返回一个框架对象。如果给定了可选的整数深度,则返回堆栈顶部以下多次调用的框架对象。如果这比调用堆栈更深,则会引发 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
推荐阅读
- background-image - 将文本放置在带有 layout="responsive" 的 amp-img 中
- excel - 在 VBA 宏中执行简单的数学运算
- amazon-sqs - DeleteMessage 操作 - 无效的收据句柄
- javascript - 需要帮助将表单数据发送到电子邮件地址,使用
- java - 异常后for循环重置
- python - Matplotlib 上的乳胶没有被识别为字符串
- android - SharedPreferences.Editor.commit() 返回 true 但没有将更改写入持久存储
- google-translate - tags disappear (Google Cloud Translation API)
- asp.net - ASP.net IdentiyServer 3 AuthorizationCodeReceived 未触发
- php - 在 WordPress cronjob 中调用 do_action()