Python 调试时查看冻结的生成器的状态
以以下示例代码为例:Python 调试时查看冻结的生成器的状态,python,pycharm,python-2.x,pdb,Python,Pycharm,Python 2.x,Pdb,以以下示例代码为例: def gen(): for i in range(5): yield i def main(): for j in gen(): print j 当执行点位于main(例如打印行)时,我是否可以检查gen的状态,即I的值?与常规函数不同,它不会出现在调用堆栈上。否,因为无法访问生成器对象,而且pdb不支持调试挂起的堆栈帧。如果保存了generator对象,则可以手动检查其gi_框架,不过: >>> def gen():
def gen():
for i in range(5): yield i
def main():
for j in gen():
print j
当执行点位于main(例如打印行)时,我是否可以检查gen的状态,即I的值?与常规函数不同,它不会出现在调用堆栈上。否,因为无法访问生成器对象,而且pdb不支持调试挂起的堆栈帧。如果保存了generator对象,则可以手动检查其gi_框架,不过:
>>> def gen():
... for i in range(5):
... yield i
...
>>> def main():
... g = gen()
... for j in g:
... import pdb
... pdb.set_trace()
... print j
...
>>> main()
> <stdin>(6)main()
(Pdb) p g.gi_frame.f_locals['i']
0
在这里,我通过gi_frame访问了生成器的悬挂框架,然后通过f_locals访问了框架的局部。与局部变量一样,不要尝试手动修改f_局部变量。但是j在调用堆栈上。@stephernauch我对j不感兴趣。是的,在这种特殊情况下,它们是相等的,但对于另一种代码,情况可能并非如此。这段代码只是一个例子。好的,pdb不支持访问挂起的生成器。Python本身做什么?毕竟,pdb可以计算任何Python表达式。例如,像sys.\u getframe之类的东西,或者与当前帧相关联的对象中的东西。@ivan\u pozdeev:对生成器的引用位于主帧的值堆栈中,该帧的一部分不暴露于Python代码中。