python - guia - Convertir el objeto del generador en una lista para la depuración
qgis manual (1)
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 elemento adicional.
Tampoco puede llamar directamente a la list
en IPython, ya que entra en conflicto con un comando para enumerar 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)<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.
Método general para escapar conflictos de nombre de función / variable / depurador
Hay comandos de depuración p
y pp
que print
y print
cualquier expresión que los siga.
Entonces podrías usarlo de la siguiente manera:
$ 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
También hay un comando exec
, llamado al ponerle un prefijo a tu expresión !
, lo que obliga al depurador a tomar su expresión como Python.
ipdb> !list(g1)
[]
Para obtener más detalles, consulte help p
, help pp
y help exec
when 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, e.g.:
(Pdb) global list_options; list_options = [''-l'']
Esta pregunta ya tiene una respuesta aquí:
Cuando estoy depurando en Python usando IPython, a veces llego a un punto de quiebre y quiero examinar una variable que actualmente es un generador. La forma más simple que puedo pensar de hacer esto es convirtiéndolo en una lista, pero no tengo claro cuál es una forma fácil de hacer esto en una línea en ipdb
, ya que soy muy nuevo en Python.