inspect.currentframe() 在某些实现下可能不起作用?
Posted
技术标签:
【中文标题】inspect.currentframe() 在某些实现下可能不起作用?【英文标题】:inspect.currentframe() may not work under some implementations? 【发布时间】:2012-04-13 21:40:06 【问题描述】:根据docs:
inspect.currentframe()
返回调用者堆栈的框架对象 框架。
CPython 实现细节:此函数依赖于 Python 堆栈 解释器中的框架支持,不保证存在于 Python的所有实现。如果在没有的实现中运行 Python栈帧支持这个函数返回None。
为什么只有这个函数被标记为“依赖于实现”?如果这个功能不起作用,是不是类似的功能,比如inspect.trace
、inspect.stack
等也不能用了?
另外,“堆栈框架支持”是什么意思,为什么它会不存在?
【问题讨论】:
【参考方案1】:在自己寻找答案时偶然发现了这个问题。 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 可以工作。
【讨论】:
【参考方案2】:文档引用的其他实现是 Jython 和 IronPython。这些是在不同的 VM(JVM 和 CLR)中运行并且没有这样的堆栈框架的 Python 语言实现。不过,我认为 IronPython 后来增加了一些对此的支持。
【讨论】:
但是为什么不支持inspect.currentframe
而 inspect.trace
和 inspect.stack
工作正常? (这就是文档所暗示的。)
对于 Ironpython,inspect.currentframe()
的替代品是什么?以上是关于inspect.currentframe() 在某些实现下可能不起作用?的主要内容,如果未能解决你的问题,请参考以下文章