Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 调试时查看冻结的生成器的状态_Python_Pycharm_Python 2.x_Pdb - Fatal编程技术网

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代码中。