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.traceinspect.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.currentframeinspect.traceinspect.stack 工作正常? (这就是文档所暗示的。) 对于 Ironpython,inspect.currentframe() 的替代品是什么?

以上是关于inspect.currentframe() 在某些实现下可能不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

python模块包引入

生成器原理介绍

Python学习详细异常信息

python语言如何使用print()打印当前行

函数在某点可导与可微~

应用程序在某行崩溃,为啥?