Python-Debugger:Verbessern Sie mühelos Ihre Debug-Fähigkeiten
Das Debuggen von Python-Code läuft für viele von uns darauf hinaus, print-Anweisungen hinzuzufügen und zu versuchen, basierend auf der Ausgabe zu begründen, was vor sich geht. Es ist nicht ideal, aber aus irgendeinem Grund wollen die Leute den Python-Debugger einfach nicht anfassen.
Inhaltsverzeichnis
Drucken zum Debuggen von Code verwenden
Wenn Sie zu den Personen gehören, die print
verwenden zum Debuggen:Ich verurteile Sie nicht . Python zu lernen ist schwer. Programmieren ist schwer. Das Leben ist hart. Ich verstehe, dass das Lernen einer weiteren Sache ermüdend erscheint, wenn Sie bereits Probleme haben. Und das Hinzufügen dieser Druckanweisung zu Ihrem Code … es ist einfach einfacher. Kleines Geständnis:Ich mache es auch immer noch. Es ist nicht so schlimm, wie manche es scheinen lassen.
Trotzdem werde ich Ihnen einen kleinen Trick beibringen, der genauso einfach ist wie das Hinzufügen von Druckanweisungen zu Ihrem Code. Dieser Trick verleiht Ihnen jedoch unendliche Debugging-Möglichkeiten und ermöglicht es Ihnen, die Welt zu erobern, falls dies erforderlich sein sollte.
Festlegen eines Python-Debugger-Haltepunkts
Sie benötigen keine IDE, um Ihren Code ordnungsgemäß zu debuggen. Dieser Trick funktioniert immer, selbst im einfachsten Editor und sogar in Jupyter Notebooks.
Der Trick besteht darin, mit der Anweisung breakpoint()
einen sogenannten Breakpoint zu setzen . Sie können es in Ihren Code einfügen, unabhängig davon, welchen Editor oder welche IDE Sie verwenden, an der Stelle, an der Sie normalerweise diese lästige Druckanweisung einfügen würden.
Was passiert also, wenn Sie dies tun? Lass es uns herausfinden! Erstellen Sie ein einfaches Programm wie das folgende:
def add_two(x): return x + 2 for i in range(1, 10): a = add_two(i) breakpoint() print(a)
Wenn Sie dies ausführen, und es spielt keine Rolle, ob Sie dies in der REPL, über die Befehlszeile oder in Ihrer IDE tun, werden Sie in den Python-Debugger namens PDB versetzt. Aber was nun?
Verwendung des Python-Debuggers
Wenn ich das obige kleine Programm starte, passiert Folgendes:
$ python3 breakpointing.py > /home/erik/breakpointing.py(7)<module>() -> print(a) (Pdb)_
Hier gibt es ein paar Dinge zu sehen:
- Es zeigt die aktuell gestartete Datei (
breakpointing.py
) - Danach wird der nächste Befehl angezeigt, der gerade ausgeführt werden sollte, aber durch den Aufruf von
breakpoint()
unterbrochen wurde . - Und schließlich sehen wir die pdb-Eingabeaufforderung, die auf unsere Eingabe wartet.
Der Python-Debugger ist eigentlich eine voll funktionsfähige Python-Shell, genau wie die REPL.
An dieser Stelle können wir die aktuelle Umgebung untersuchen. Mal sehen, was der Wert von a
ist ist gerade:
(Pdb) print(a) 3 (Pdb) print(i) 1
Anstelle von print können Sie auch den pdb-spezifischen Befehl p verwenden, etwa so:
(Pdb) p a 3 (Pdb_ p i 1
Nächste Zeile ausführen
Was also, wenn wir die nächste Codezeile ausführen wollen? Es gibt zwei Möglichkeiten:
- Mit
s
oderstep
, führen Sie die aktuelle Zeile aus. Danach stoppt der Debugger bei der nächstmöglichen Gelegenheit. - Mit
n
odernext
, führen Sie auch die aktuelle Zeile aus, aber jetzt macht der Debugger weiter, bis die nächste Zeile der aktuellen Funktion erreicht ist.
Zur Verdeutlichung:step
tritt glücklich in einen Funktionsaufruf ein und bricht innerhalb dieser Funktion ab. Im Gegensatz dazu next
führt die Funktion aus, bis sie zurückkehrt, und bricht in der nächsten Zeile ab.
Andere Debugger und IDEs nennen dies auch „step into“ (statt step) und „step over“ (statt next).
Lassen Sie uns nun diese beiden verwenden:
$ python3 breakpointing.py -> print(a) (Pdb) s 3 -> for i in range(1, 10): (Pdb) s -> a = add_two(i) (Pdb) n -> breakpoint() (Pdb) n -> print(a) (Pdb) n 4 -> for i in range(1, 10): (Pdb) s -> a = add_two(i) (Pdb) s --Call-- -> def add_two(x): (Pdb) s -> return x + 2 (Pdb) s --Return-- 5 -> return x + 2 (Pdb) s -> breakpoint() (Pdb)
Wie Sie sehen können, gehen wir zunächst über den Aufruf von add_two
mit n
. Beim zweiten Mal steigen wir mit s
in die Funktion ein .
Python-Debugger-Befehle
Es gibt weitere Befehle, die Sie selbst ausprobieren können. Ich werde sie nicht alle auflisten, nur die nützlichsten:
h
(Hilfe):Alle verfügbaren Befehle drucken. Nimmt auch ein Argument, z.h c
sagt Ihnen, was derc
Befehl tutc
(weiter):bis zum nächsten Haltepunkt laufenl
(Liste):listet den Quellcode um die aktuelle Zeile aufp
:gibt das Ergebnis des folgenden Ausdrucks aus. Sie können dies verwenden, anstattprint()
aufzurufenpp
:schöner Druck, nützlich zum Drucken von Datenstrukturen wie Wörterbüchern- Neustart:Starten Sie das aktuelle Programm neu
Die vollständige Dokumentation finden Sie auf der Python-Debugger-Seite, auf der alle Befehle aufgelistet sind.
Weiter lernen
Obwohl dies sehr praktisch sein kann, lohnt es sich, in den Debugger einzutauchen, den Ihre IDE bietet. Wenn Sie ein VSCode-Benutzer sind, habe ich ein Tutorial zum Debuggen von Python-Code in VSCode geschrieben.
Python
- Python-Eingabe, -Ausgabe und -Import
- Python Print()-Anweisung:Drucken mit Beispielen
- Python-Strings:Ersetzen, Verbinden, Teilen, Umkehren, Groß- und Kleinbuchstaben
- Python time.sleep():Verzögerung zu Ihrem Code hinzufügen (Beispiel)
- Python New Line:So drucken Sie OHNE Newline in Python
- Verbundene Flotten verbessern Ihr Endergebnis
- Wie Prototypen Ihren Fertigungsprozess verbessern
- 5 Möglichkeiten zur Verbesserung Ihrer Blechteile
- 3 Tipps zur Verbesserung Ihres Gerätewartungsplans
- Tipps und Überlegungen:Lernen Sie, Ihre PCB-Designfähigkeiten zu verbessern