我如何获得所有当前堆栈帧的f_globals属性
问题描述:
我想要获取所有当前堆栈帧并对每个帧的每个帧f_globals
属性进行一些检查。这与unittest
模块的工作方式非常相似,除了在我的情况下,还没有抛出异常。 traceback.extract_stack()
不允许访问此内容,但在引发异常时sys.exc_info()
会执行此操作。我如何获得所有当前堆栈帧的f_globals属性
答
只需使用检查模块中的“stack”功能即可。
>>> import inspect
>>> inspect.stack()
[(<frame object at 0x02467FE0>, '<stdin>', 1, '<module>', None, None)]
该调用产生一个列表,其中每个元素是一个元组,由(根据Python docs)运行框架和框架上的额外信息的:
[frame, filename, line number, function name, frame sources, current line index in sources]
向每个帧对象上检查f_globals
:
>>> for frame_tuple in inspect.stack():
... print frame_tuple[0].f_globals.keys()
...
['frame_tuple', '__builtins__', 'inspect', '__package__', '__name__', 'readline', 'rlcompleter', '__doc__']
“堆栈”功能是缓慢的,但是,要在实际运行的代码用于除设置东西,或者调试的任何其他。如果您需要检查堆栈的某些运行时操作(如获取变量值或其他基于自检的代码),请使用inspect.currentframe()
获取每帧上的当前帧和.f_back
属性以链接到前一帧 - 这足够快。
您不应该使用sys._getframe
,因为如名称开头的下划线所示,它不适合公众使用。
答
current_frame = sys._getframe(0)
然后你可以使用f_back
属性走上堆栈(直到它None
)。
请注意,这是CPython特定的并且被视为实现细节。