【发布时间】:2021-04-08 15:10:01
【问题描述】:
可以让 logger 装饰器打印被装饰函数的变量名和值
def logger(f):
def inner(*args):
f(*args)
print(vars())
return inner
@logger
def add(a,b):
c = 5
d = a + b +c
return d
add(1,2)
输出:
{'args': (1, 2)}
预期输出:
{'d': 8, 'c': 5, 'b': 2, 'a': 1}
【问题讨论】:
-
没那么简单。您的
logger函数必须到达f内部才能报告变量值;它们不在同一范围级别。也许您可以阅读一些有关如何进入运行时堆栈的信息。即使这样,您仍希望add调用vars以获取变量的运行时状态。该信息仅在add运行时存在。 -
一直在谷歌搜索并没有真正找到任何东西,您有任何资源可以了解如何达到运行时堆栈?
-
理论上这可能在 CPython 中通过修改字节码来创建一个新的函数对象来实现,但它会很混乱。问题是您只能从函数的堆栈帧中获取局部变量,但访问它的唯一方法是从函数本身内部,因此需要更改函数以保留堆栈帧的副本或否则就是它的局部变量的字典。
-
很可能有一个替代你想做的事情 - 我猜你想要这个装饰器来调试功能,所以也许现有的调试器会做你想做的事,也许是交互式的像Python Tutor 这样的可视化工具会做你想做的事,或者
pdbAPI 可以用来做你想做的事。
标签: python python-3.x python-decorators