根据docs:
inspect.currentframe()
返回调用者堆栈的帧对象 帧。
CPython实现细节:此函数依赖于Python堆栈 解释器中的帧支持,不保证存在于 Python的所有实现。如果在没有实现的情况下运行 Python堆栈帧支持此函数返回None。
仅将此功能标记为“依赖于实现”?如果此功能不起作用,那么类似的功能(例如inspect.trace
,inspect.stack
等)是否也不可用?
此外,“堆叠帧支持”是什么意思,为什么它会不存在?
答案 0 :(得分:3)
在寻找答案的同时偶然发现了这个问题。 inspect.currentframe
的可用性与sys._getframe
:
def currentframe():
"""Return the frame of the caller or None if this is not possible."""
return sys._getframe(1) if hasattr(sys, "_getframe") else None
此限制因此也适用于使用sys._getframe
的所有其他功能。对于inspect
,这只是inspect.stack
。
相反,inspect.trace
使用sys.exc_info
。这是异常处理方案的组成部分,应始终可用。所有其他相关功能,例如getframeinfo
,已经依赖于有一个框架。它们的适用性取决于您是要检查异常还是调用回溯。
请注意,我的本地默认jython 支持sys._getframe
。如果使用-X:Frames
运行,则ipy有效。
答案 1 :(得分:2)
文档引用的其他实现是Jython和IronPython。这些是在不同的VM(JVM和CLR)中运行的Python语言实现,并且没有这样的堆栈帧。不过,我认为IronPython后来增加了一些支持。