调试时查看冻结生成器的状态

View state of a frozen generator while debugging

举个例子以下示例代码:

def gen():
    for i in range(5): yield i

def main():
    for j in gen():
        print j

当执行点在main()时(例如在print行),我能否以某种方式检查gen()的状态(即i的值) )?与常规函数不同,它不会出现在调用堆栈中。

不,因为无法访问生成器对象,并且因为 pdb 不支持调试挂起的堆栈帧。如果您保存了生成器对象,您可以手动检查它的 gi_frame,不过:

>>> 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 访问了框架的 locals()。 (与 locals() 一样,不要尝试手动修改 f_locals。)