2014-06-09 16 views
60

Podczas debugowania w Pythonie za pomocą IPython, czasami uderzam w punkt przerwania i chcę zbadać zmienną, która jest obecnie generatorem. Najprostszy sposób, w jaki mogę to zrobić, to przekształcenie go na listę, ale nie jestem pewien, co to jest łatwy sposób na zrobienie tego w jednym wierszu w ipdb, ponieważ jestem nowy w Pythonie.Konwersja obiektu generatora na listę w celu debugowania

Odpowiedz

102

Po prostu zadzwoń pod list na generator.

lst = list(gen) 
lst 

Należy pamiętać, że ma to wpływ na generator, który nie zwróci żadnych dalszych elementów.

Nie można również bezpośrednio wywoływać list w IPython, ponieważ powoduje konflikt z poleceniem dla listy linii kodu.

Testowane na tego pliku:

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) 

który po uruchomieniu:

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

Ogólny sposób ucieczki funkcji/zmienną/nazwę debugger konflikty

Istnieje poleceń debugger p i pp że będzie print i prettyprint każde wyrażenie następujące po nich.

więc można go używać w następujący sposób:

$ 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 

Istnieje również komenda exec, zwany poprzedzając swój wyraz z ! debugger, który zmusza do podjęcia wyraz jak Python jednym.

ipdb> !list(g1) 
[] 

Aby uzyskać więcej informacji, zobacz help phelp pp i help exec kiedy 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'] 
Powiązane problemy