python - 为什么 python 生成器框架的 (gi_frame) f_back 属性总是没有?

标签 python generator python-2.6 callstack

标题是不言自明的。我正在做类似的事情:

gen = obj #some generator instance running
frame = obj.gi_frame
prevframe = frame.f_back

但对于 prevframe,我总是得到 None。为什么会这样。另外,是否有一些解决方法?

上下文:我正在尝试编写一个简单的调用堆栈方法来确定什么调用了特定函数。我正在使用扭曲的检修孔并通过远程登录进入正在运行的进程,然后在其中执行这些命令,但我似乎无法访问之前的帧。

最佳答案

据我所知,这是有意为之,无法解决。负责它的 cpython 中的代码是 here ,这表明一旦生成器产生(或排除),对前一帧的引用就会被破坏,以防止引用计数问题。似乎预期的行为是生成器的前一帧在每次进入时都会被换出,因此当它不运行时,“父帧”的概念没有多大意义。

至少在事后分析上下文中,正确的方法是使用追溯对象,它们的帧列表以相反的顺序链接,tb_next 而不是 f_back。

关于python - 为什么 python 生成器框架的 (gi_frame) f_back 属性总是没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41239455/

相关文章:

java - Jackson 生成意外的 "new"字段

python - 值(value)错误、真值错误、模糊错误

py2exe - 在 python 2.6 上加载 win32file.pyd 的问题

python - 大多数 "pythonic"组织类属性、构造函数参数和子类构造函数默认值的方式?

python - 即使我的 MQTT 客户端未连接,我如何继续我的程序运行?

python - 从对中获取另一个元素

php - 生成器不能处于闭包状态

javascript - ES6 尾调用优化是否涵盖生成器?

python - 更改日期对象 Python 的时区

python - Tensorflow 无法检测到我的 RTX 3050 笔记本 GPU