我正在尝试获取所有当前堆栈帧并对每个帧的每个帧f_globals属性进行一些检查。这与unittest模块的工作方式非常相似,只是在我的情况下,没有抛出异常。 traceback.extract_stack()不提供对此的访问权限,但在sys.exc_info()引发异常时框架中会这样做。
只需使用检查模块中的“ 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, 因为正如名称开头的下划线所示,它不适合公共使用。