【发布时间】:2020-02-24 04:09:50
【问题描述】:
我写了一个小函数,它在堆栈中查找一层并查看其中是否有变量。但是如何将这个函数变成一个在堆栈中一直查找直到找到一个局部变量的函数?
import inspect
def variable_lookup(variable):
parent_locals = inspect.currentframe().f_back.f_locals
if variable in parent_locals.keys():
return parent_locals[variable]
我想要的是循环,直到它遍历所有堆栈,试图找到变量。我如何使用检查来做到这一点?有没有更简单的方法?
我从这个开始,但是 f_back 没有返回一个框架对象,所以我不知道从这里去哪里:
import inspect
def variable_lookup(variable):
previous_frame = inspect.currentframe().f_back
while True:
print(variable in previous_frame.f_locals.keys())
previous_frame = inspect.getframeinfo(previous_frame)
因此代码在AttributeError: 'Traceback' object has no attribute 'f_locals' 下失败
【问题讨论】:
-
parent_locals.keys不是字典。那是方法参考。您也不需要调用keys(),只需使用if variable in parent_locals:。 -
真的很好奇你为什么需要这个。似乎正在颠覆一些设计。可能有更好的方法来做到这一点。
-
@PeterWood:不过,它在调试奇怪问题时会很有帮助。
-
@PeterWood 我只是在处理一个边缘案例,在这种情况下,一个特定的函数可以在不需要将该值传递给它的情况下查看某物的值,这将是非常好的。
-
如果函数是成员函数,它所在的对象可以携带状态而不是传递给函数。