Convertir el objeto generador a la lista para la depuración

Cuando estoy depurando en Python usando IPython, a veces llego a un punto de ruptura y quiero examinar una variable que actualmente es un generador. La forma más sencilla en que puedo pensar en hacer esto es convertirlo en una lista, pero no tengo claro qué es una forma fácil de hacer esto en una línea en ipdb , ya que soy muy nuevo en Python.

Simplemente llame a la list en el generador.

 lst = list(gen) lst 

Tenga en cuenta que esto afecta al generador que no devolverá ningún otro elemento.

Tampoco puede llamar directamente a list en IPython, ya que entra en conflicto con un comando para listar líneas de código.

Probado en este archivo:

 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) 

que cuando se ejecuta:

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

Método general para escapar de los conflictos de función / variable / depurador de nombre

Hay comandos de depuración p y pp que print y print cualquier expresión que los siga.

Así que podrías usarlo de la siguiente manera:

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

También hay un comando exec , llamado prefijando su expresión con ! , lo que obliga al depurador a tomar tu expresión como Python one.

 ipdb> !list(g1) [] 

Para obtener más información, consulte la help p , la help pp y la help exec cuando help exec en el depurador.

 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']