Converter o objecto gerador para a lista de depuração [duplicado]

esta pergunta já tem uma resposta aqui:

Quando estou a debugar em Python usando IPython, às vezes bato num ponto de paragem e quero examinar uma variável que é actualmente um gerador. A maneira mais simples que consigo pensar em fazer isto é convertê - lo numa lista. claro sobre o que é uma maneira fácil de fazer isso em uma linha em {[[0]}, já que eu sou tão novo em Python.

Author: Seanny123, 2014-06-10

1 answers

Liga para o gerador.
lst = list(gen)
lst
Tenha em atenção que isto afecta o gerador, que não irá devolver mais itens.

Você também não pode ligar directamente para list em IPython, uma vez que entra em conflito com um comando para listar linhas de código.

Testado neste ficheiro:

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 quando executado:

$ 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 geral para escapar à função/variável / depurador conflitos de nome

Existem comandos de depuração p e {[9] } que irão print e prettyprint qualquer expressão que os siga.

Por isso podes usá-lo da seguinte forma:

$ 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

Existe também um comando exec, chamado por prefixação da sua expressão com !, que obriga o depurador a tomar a sua expressão como Python one.

ipdb> !list(g1)
[]

Para mais detalhes, consulte help p, help pp e help exec quando no 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']
 115
Author: Jan Vlcinsky, 2015-11-21 21:26:13