gpt4 book ai didi

python - 在 python 中检查堆栈中的局部变量

转载 作者:行者123 更新时间:2023-12-02 19:49:10 25 4
gpt4 key购买 nike

我编写了一个小函数,它在堆栈中查找一级并查看其中是否有变量。但是我如何将这个函数变成一个可以在堆栈中一直查找直到找到一个购买某个特定名称的局部变量的函数?

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() 。这将为您提供一个 FrameInfo() 对象列表,其中包含一个 frame 引用:

for frameinfo in inspect.stack(0):
if variable in frameinfo.frame.f_locals:
return frameinfo.frame.f_locals[variable]

我将源代码行数(context 参数)设置为零,仅仅为了检查局部变量而加载源代码行没有意义。

stack()函数基本上实现为:

return inspect.getouterframes(inspect.currentframe(), context)

getouterframes()只是跟随frame.f_back引用,直到找到None。因此,您也可以使用 while 循环来实现:

frame = inspect.currentframe()
while frame:
if variable in frame.f_locals:
return frame.f_locals[variable]
frame = frame.f_back

这当然是更轻量级的,因为这避免了为堆栈中的所有帧创建 FrameInfo() 实例,避免对所有帧的文件名进行自省(introspection),并且不需要访问所有链接的帧如果变量被发现得早。

关于python - 在 python 中检查堆栈中的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58598624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com