我编写了一个小函数,它在堆栈中查找一级并查看其中是否有变量。但是我如何将这个函数变成一个可以在堆栈中一直查找直到找到一个局部变量并购买某个特定名称的函数?
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'
有一个更高级别的功能可用:inspect.stack() https://docs.python.org/3/library/inspect.html#inspect.stack。这为您提供了一个列表FrameInfo()
对象,其具有frame
参考:
for frameinfo in inspect.stack(0):
if variable in frameinfo.frame.f_locals:
return frameinfo.frame.f_locals[variable]
我设置了源代码行数(context
参数)为零,加载源代码行只是为了检查局部变量是没有意义的。
The stack()
函数基本上实现为:
return inspect.getouterframes(inspect.currentframe(), context)
and getouterframes()
只是遵循frame.f_back
参考文献直到None
被发现。所以你也可以用while
loop:
frame = inspect.currentframe()
while frame:
if variable in frame.f_locals:
return frame.f_locals[variable]
frame = frame.f_back
这当然是更轻的重量,因为这避免了创建FrameInfo()
堆栈中所有帧的实例,避免对所有帧的文件名进行内省,并且如果较早找到变量,则不需要访问所有链接的帧。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)