Debugging-Workflow
Sie müssen verstehen, dass Sie tatsächlich eine andere Integration des Python-Debuggers verwendenpdb
und ipdb
(welche verwendet pdb
und auf welche über das Modul zugegriffen werden kann ipdb
). Ich hoffe, dieses triviale Beispiel hilft Ihnen dabei, es besser zu nutzen.
Angenommen, Sie möchten diesen Code debuggen:
def Waiting_fun():
for i in range(100):
pass
def New_sum(lista, to_s = False):
result = 0
print 1
for i in lista:
print "summed"
result +=i
Waiting_fun()
if to_s:
result = str(result)
return result
a = New_sum([1,4,5,7,8])
b = New_sum([1,4],1)
c = 456
d = New_sum([6,8,9],1)
final_result = a*b*c*d
Out: Type error
Schnelles erstes Debuggen mit iPython% debug
%debug
Das erste, was ich mache, ist, pdb von iPython mit dem Befehl magic aufzurufen. %debug
Sie können es mit als Standardmechanismus festlegen %pdb
.
%debug
> /home/opdate/Desktop/test.py(23)<module>()
19 a = New_sum([1,4,5,7,8])
20 b = New_sum([1,4],1)
21 c = 456
22 d = New_sum([6,8,9],1)
---> 23 final_result = a*b*c*d
Sobald Sie zu Mittag essen pdb
. Sie finden alle Befehle in den offiziellen Dokumenten oder können sie mit dem Befehl h
anzeigen. In dieser Phase verwende ich nur folgende Befehle:
p
: Gibt die von Ihnen angegebenen Variablen aus
pp
: hübsche Drucke
args
: Wenn Sie sich in einer Funktion befinden, werden die Argumente gedruckt
pp locals()
: kann nützlich sein, um alle Variablen zu drucken, aber meistens ist es ein Chaos!
!
Verwenden Sie es, wenn Sie Konflikte mit den in aufgeführten Befehlen vermeiden möchten h
whatis
Variablenname: Äquivalent zum Typ (Variablenname)
u
: Verschieben Sie den aktuellen Frame im Stack-Trace um eine Ebene nach oben (in einen älteren Frame).
d
: Verschieben Sie den aktuellen Frame im Stack-Trace um eine Ebene nach unten (in einen neueren Frame).
q
: Wenn Sie fertig sind, können Sie q zum Beenden verwenden
In unserem Fall:
ipdb> pp a,b,c,d
(25, '5', 456, '23')
Oder ipdb> !a,b,c,d
(kein Leerzeichen zwischen dem Ausrufezeichen und dem ersten Wert). Es ist klar, dass b und d Zeichenfolgen sind, falls wir Folgendes verwenden können:
ipdb> whatis b
<type 'str'>
Mit Haltepunkten tiefer gehen
In 70% der Fälle %debug
weisen Sie auf die Lösung hin. Wenn Sie weitere Funktionen wie Haltepunkte benötigen, ist es Zeit, Spyder zu verwenden. In diesem Fall möchten wir verstehen, warum b
eine Zeichenfolge einen Haltepunkt daneben setzt (Doppelklick neben der Zeilennummer im Editorfenster). Ich finde es viel besser , die Standard-Python-Konsole anstelle der IPython-Konsole zum Debuggen zu verwenden. Wählen Sie daher die Konsole aus, bevor Sie mit dem Debuggen beginnen:
Öffnen Sie dann die variable explorer
Option, wenn Variablen vorhanden sind. Ich benutze Ctrl+ F5, um das Debuggen zu starten. Sie können die Schaltflächen oben verwenden, aber ich bevorzuge die unten gezeigten Verknüpfungen:
(Pdb) c
(Pdb) s
(Pdb) args
(Pdb) s
(Pdb) ⏎
(Pdb) whatis result
(Pdb) unt
(Pdb) n
(Pdb) s
(Pdb) whatis result
(Pdb) j 6
(Pdb) tbreak 12
(Pdb) c
(Pdb) j 6
(Pdb) whatis result
Jetzt haben wir den Fehler gefunden. Wir können auch eine Lösung testen, indem wir den Schritt bis 12 wiederholen und einstellento_s = False
(Pdb) to_s = False
Es klappt. Eine wichtige Funktion bei der Verwendung der Standard-PDF in der Python-Konsole ist, dass Sie eine automatische Konkurrenz haben und den Variablen-Explorer verwenden können, anstatt whatis
und zu verwenden pp
:
Mit dem Variablen-Explorer können Sie auch den Wert der Variablen ändern, wodurch die Dinge noch schneller werden.
Bedingte Haltepunkte
Eine andere cleverere Möglichkeit, den Fehler zu lokalisieren, ist die Verwendung des bedingten Haltepunkts ( Shift+ F12). Ein großer Vorteil von Spyder ist das Debuggen und Verwenden von Listen-Haltepunkten. Bedingte Haltepunkte werden aktiviert, wenn die Bedingung lautet. True
In unserem Fall möchten wir ermitteln, wo b zu einer Zeichenfolge wird. Die Bedingung lautet also : type(b) == str
. Normalerweise platziere ich viele bedingte Haltepunkte und sehe, welche die Bedingung erfüllen. Verwenden Sie dazu nicht Shift+, F12sondern platzieren Sie normale Haltepunkte, indem Sie neben der Zeile doppelklicken, und gehen Sie zu Debug-> Haltepunkte auflisten. Kopieren Sie die Bedingung in der Tabelle und fügen Sie sie in jeden Haltepunkt ein, wie in der folgenden Abbildung gezeigt.
Von hier aus sind folgende Befehle zu verwenden:
(Pdb) c
(Pdb) u
(Pdb) d
sys.exit()
vorübergehend ein, aber es wäre bequemer, wenn ich eine Haltepunktoption hätte.