inspect.currentframe()在某些实现下可能无法正常工作?

时间:2012-03-30 07:52:04

标签: python python-3.x stack language-implementation

根据docs

  

inspect.currentframe()

     

返回调用者堆栈的帧对象   帧。

     

CPython实现细节:此函数依赖于Python堆栈   解释器中的帧支持,不保证存在于   Python的所有实现。如果在没有实现的情况下运行   Python堆栈帧支持此函数返回None。

仅将此功能标记为“依赖于实现”?如果此功能不起作用,那么类似的功能(例如inspect.traceinspect.stack等)是否也不可用?

此外,“堆叠帧支持”是什么意思,为什么它会不存在?

2 个答案:

答案 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后来增加了一些支持。