标题非常明显。我正在做类似的事情:
gen = obj #some generator instance running
frame = obj.gi_frame
prevframe = frame.f_back
但我总是None
获得prevframe
。为什么会这样。此外,还有一些解决方法吗?
背景:我正在尝试编写一个简单的调用堆栈方法来确定调用特定函数的内容。我正在使用扭曲的沙井和telnet到一个正在运行的进程,然后我执行这些命令,但我似乎无法访问以前的帧。
答案 0 :(得分:0)
据我所知,这既是故意的,也无法解决。 cpython中负责此操作的代码为here,它指示一旦生成器屈服(或排除),对前一帧的引用就会中断,以防止引用计数出现问题。看来,预期的行为是每次进入生成器时,生成器的前一帧都会被交换掉,因此,尽管它不在运行,但“父帧”的概念并没有多大意义。
至少在事后分析中,正确的方法是使用回溯对象,该对象的帧列表以相反的顺序链接,即tb_next而不是f_back。