Python-Debugging meistern: Effiziente Techniken & Best Practices
Python-Code debuggen bedeutet für viele von uns: print-Statements einfügen und basierend auf der Ausgabe rätseln, was vor sich geht. Nicht ideal, aber aus irgendeinem Grund wollen viele den Python-Debugger nicht anfassen.
print zum Debuggen nutzen
Falls Sie zu denen gehören, die print zum Debuggen nutzen: Ich verurteile Sie nicht. Python lernen ist schwer. Programmieren ist schwer. Das Leben ist schwer. Ich verstehe, dass das Erlernen eines weiteren Tools müde macht, wenn man schon kämpft. Und den print-Befehl einzufügen… es ist einfach einfacher. Ein kleines Geständnis: Ich mache es auch andauernd. Es ist nicht so schlimm, wie manche tun.
Aber ich zeige Ihnen einen kleinen Trick, der genauso einfach ist wie print-Statements einzufügen. Dieser Trick gibt Ihnen jedoch unendliche Debugging-Möglichkeiten und lässt Sie die Welt erobern, falls nötig.
Python-Debugger-Breakpoint setzen
Sie brauchen keine IDE, um Code richtig zu debuggen. Dieser Trick funktioniert immer, selbst im einfachsten Editor und sogar in Jupyter Notebooks.
Der Trick: einen sogenannten Breakpoint mit der Anweisung breakpoint() setzen. Sie können ihn in Ihren Code einfügen, egal welchen Editor oder IDE Sie nutzen, genau an der Stelle, wo Sie sonst den lästigen print-Befehl setzen würden.
Was passiert dann? Finden wir es heraus! Erstellen Sie ein simples 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 das ausführen – egal ob in der REPL, von der Kommandozeile oder in Ihrer IDE – landen Sie im Python-Debugger PDB. Und nun?
Python-Debugger nutzen
Wenn ich das kleine Programm oben starte, passiert Folgendes:
$ python3 breakpointing.py > /home/erik/breakpointing.py(7)<module>() -> print(a) (Pdb)
Ein paar Dinge sind zu sehen:
- Die aktuelle Datei wird angezeigt (
breakpointing.py) - Danach der nächste Befehl, der ausgeführt werden sollte, aber durch
breakpoint()unterbrochen wurde. - Und schließlich der PDB-Prompt, der auf unsere Eingabe wartet.
Der Python-Debugger ist eigentlich eine voll funktionsfähige Python-Shell, genau wie die REPL.
An diesem Punkt können wir die aktuelle Umgebung inspizieren. Sehen wir, welchen Wert a gerade hat:
(Pdb) print(a) 3 (Pdb) print(i) 1
Statt print können Sie auch den PDB-spezifischen Befehl p nutzen:
(Pdb) p a 3 (Pdb) p i 1
Nächste Zeile ausführen
Was, wenn wir die nächste Code-Zeile ausführen wollen? Zwei Optionen:
- Mit
soderstepführen Sie die aktuelle Zeile aus. Der Debugger stoppt bei der nächstmöglichen Gelegenheit danach. - Mit
nodernextführen Sie die aktuelle Zeile ebenfalls aus, aber der Debugger läuft weiter bis zur nächsten Zeile der aktuellen Funktion.
Zur Verdeutlichung: step betritt einen Funktionsaufruf gerne und bricht innerhalb dieser Funktion. Im Gegensatz dazu führt next die Funktion bis zur Rückgabe aus und bricht bei der nächsten Zeile.
Andere Debugger und IDEs nennen dies „Step Into“ (statt step) und „Step Over“ (statt next).
Jetzt nutzen wir beide:
$ 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, übergehen wir den Aufruf von add_two beim ersten Mal mit n. Beim zweiten Mal steigen wir mit s in die Funktion ein.
Python-Debugger-Befehle
Es gibt mehr Befehle, die Sie selbst ausprobieren können. Ich liste nicht alle, nur die nützlichsten:
h(help): Zeigt alle verfügbaren Befehle. Nimmt auch Argument, z. B.h cerklärt, wasctut.c(continue): Läuft weiter bis zum nächsten Breakpoint.l(list): Listet Quellcode um die aktuelle Zeile.p: Gibt das Ergebnis des folgenden Ausdrucks aus. Kann stattprint()genutzt werden.pp: Pretty Print, nützlich für Datenstrukturen wie Dictionaries.restart: Startet das aktuelle Programm neu.
Für die komplette Dokumentation: Python-Debugger-Seite, wo alle Befehle gelistet sind.
Weiterlernen
Obwohl dies super hilfreich sein kann, lohnt es sich, in den Debugger Ihrer IDE einzutauchen. Nutzen Sie VSCode? Ich habe ein Tutorial geschrieben, wie man Python-Code in VSCode debuggt.
Python
- Python I/O & Modul-Importe meistern: Praxisleitfaden
- Python print()-Funktion: Praktischer Leitfaden mit Beispielen
- Python String-Operationen meistern: Replace, Join, Split, Reverse und Case Conversion
- Python time.sleep(): Delays in Ihrem Code hinzufügen (Beispiel)
- Python Print ohne Newline: Den end-Parameter & andere Techniken meistern
- Gewinne maximieren mit Fords erweiterter Connected Fleet Management
- Produktion beschleunigen: Wie Prototyping Ihren Fertigungsprozess verbessert
- 5 bewährte Strategien zur Qualitätssteigerung von Blechteilen
- 3 bewährte Strategien zur Optimierung Ihres industriellen Wartungsplans
- PCB-Design meistern: Wesentliche Tipps & Best Practices für Ingenieure