标题是不言自明的。我正在做类似的事情:
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/