调试时查看冻结生成器的状态
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
。)
举个例子以下示例代码:
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
。)