将生成器对象转换为列表进行debugging

当我使用IPython在Python中进行debugging时,有时候会碰到一个断点,我想检查一个当前是一个生成器的variables。 我能想到的最简单的方法就是把它转换成一个列表,但是我不清楚在ipdb一行中做什么的简单方法,因为我对Python很ipdb

只需在发生器上调用list

 lst = list(gen) lst 

请注意,这影响发电机不会返回任何更多的项目。

您也不能直接在IPython中调用list ,因为它与用于列出代码行的命令发生冲突。

testing这个文件:

 def gen(): yield 1 yield 2 yield 3 yield 4 yield 5 import ipdb ipdb.set_trace() g1 = gen() text = "aha" + "bebe" mylst = range(10, 20) 

运行时:

 $ python code.py > /home/javl/sandbox/so/debug/code.py(10)<module>() 9 ---> 10 g1 = gen() 11 ipdb> n > /home/javl/sandbox/so/debug/code.py(12)<module>() 11 ---> 12 text = "aha" + "bebe" 13 ipdb> lst = list(g1) ipdb> lst [1, 2, 3, 4, 5] ipdb> q Exiting Debugger. 

转义函数/variables/debugging器名称冲突的一般方法

有debugging器命令pppprintprettyprint print prettyprint任何expression式。

所以你可以使用它如下:

 $ python code.py > /home/javl/sandbox/so/debug/code.py(10)<module>() 9 ---> 10 g1 = gen() 11 ipdb> n > /home/javl/sandbox/so/debug/code.py(12)<module>() 11 ---> 12 text = "aha" + "bebe" 13 ipdb> p list(g1) [1, 2, 3, 4, 5] ipdb> c 

还有一个exec命令,通过在expression式前加上! ,这迫使debugging器把你的expression式当作Python。

 ipdb> !list(g1) [] 

有关更多详细信息,请参阅help phelp pp并在debugging器中help exec

 ipdb> help exec (!) statement Execute the (one-line) statement in the context of the current stack frame. The exclamation point can be omitted unless the first word of the statement resembles a debugger command. To assign to a global variable you must always prefix the command with a 'global' command, eg: (Pdb) global list_options; list_options = ['-l']