将生成器对象转换为列表进行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器命令p
和pp
将print
和prettyprint
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 p
, help 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']