2014-06-09 13 views
60

Quando eseguo il debug in Python utilizzando IPython, a volte ho raggiunto un punto di interruzione e voglio esaminare una variabile che è attualmente un generatore. Il modo più semplice in cui posso pensare di farlo è convertirlo in una lista, ma non sono chiaro su quale sia un modo semplice per farlo in una riga in ipdb, dal momento che sono così nuovo in Python.Converti oggetto generatore in elenco per il debug

risposta

102

Basta chiamare list sul generatore.

lst = list(gen) 
lst 

Attenzione, questo influenza il generatore che non restituirà altri articoli.

Non è inoltre possibile chiamare direttamente list in IPython, poiché è in conflitto con un comando per l'elencazione di righe di codice.

provata su questo file:

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) 

che quando viene eseguito:

$ 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. 

metodo generale per sfuggire la funzione/nome debugger/variabile in conflitto

ci sono comandi debugger p e pp che sarà print e prettyprint qualsiasi espressione che li segue.

Così si potrebbe usare come segue:

$ 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 

C'è anche un comando exec, chiamato dal prefisso tua espressione con !, che costringe debugger di prendere la vostra espressione come Python uno.

ipdb> !list(g1) 
[] 

Per maggiori dettagli si veda help p, help pp e help exec quando nel debugger.

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