如何访问所有当前堆栈帧的 f_globals 属性

two*_*nac 5 python

我正在尝试获取所有当前堆栈帧并对每个帧的每个帧f_globals属性进行一些检查。这与unittest模块的工作方式非常相似,只是在我的情况下,没有抛出异常。 traceback.extract_stack()不提供对此的访问权限,但在sys.exc_info()引发异常时框架中会这样做。

jsb*_*eno 4

只需使用检查模块中的“ stack ”功能即可。

>>> import inspect
>>> inspect.stack()
[(<frame object at 0x02467FE0>, '<stdin>', 1, '<module>', None, None)]
Run Code Online (Sandbox Code Playgroud)

此调用生成一个列表,其中每个元素都是一个由运行帧和该帧的额外信息组成的元组(根据Python 文档):

[frame, filename, line number, function name, frame sources, current line index in sources]
Run Code Online (Sandbox Code Playgroud)

要检查f_globals每个框架对象:

>>> for frame_tuple in inspect.stack():
...    print frame_tuple[0].f_globals.keys()
... 
['frame_tuple', '__builtins__', 'inspect', '__package__', '__name__', 'readline', 'rlcompleter', '__doc__']
Run Code Online (Sandbox Code Playgroud)

但是,除了设置或调试之外,在实际运行的代码中使用“stack”函数很慢。如果您需要检查堆栈中的某些运行时操作(例如获取变量值或其他基于内省的代码),请务必使用inspect.currentframe()获取当前帧以及.f_back每个帧上的属性来链接到先前帧 - 这已经足够快了。

您不应该使用sys._getframe, 因为正如名称开头的下划线所示,它不适合公共使用。