2014-06-09 20 views
60

Wenn ich in Python mit IPython debuggen, habe ich manchmal einen Break-Point und ich möchte eine Variable untersuchen, die derzeit ein Generator ist. Der einfachste Weg, den ich mir vorstellen kann, ist, ihn in eine Liste zu konvertieren, aber ich weiß nicht genau, wie das in einer Zeile in ipdb funktioniert, da ich Python so neu bin.Konvertieren Generatorobjekt in die Liste zum Debuggen

Antwort

102

Rufen Sie einfach list am Generator an.

lst = list(gen) 
lst 

Beachten Sie, dass dies Auswirkungen auf den Generator hat, der keine weiteren Elemente zurückgibt.

Sie können list in IPython auch nicht direkt aufrufen, da ein Konflikt mit einem Befehl zum Auflisten von Codezeilen auftritt.

zu dieser Datei Getestet:

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) 

die bei der Ausführung:

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

Allgemeine Methode Funktion/Variable/Debugger Name

Es gibt Debuggerkommandos p und pp in Konflikt zu entkommen, dass wird print und prettyprint jeder Ausdruck ihnen folgen.

So könnte man es wie folgt verwenden:

$ 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 

Es gibt auch einen exec Befehl, genannt durch Ihren Ausdruck mit ! prefixing, dem Debugger Ihren Ausdruck als Python ein nehmen zwingt.

ipdb> !list(g1) 
[] 

Weitere Details finden help p, help pp und help exec in Debugger, wenn.

Verwandte Themen