Python-Debugging mit breakpoint

Seit Python 3.7 gibt es die built-in Funktion breakpoint(). Anstelle des häßlichen print()-Debugging, bietet es sich an, diese komfortable Alternative zu verwenden.

Betrachten wir folgendes Beispiel:

number = input("Bitte geben Sie eine Zahl ein: ")

numbers = [2, 15, 33, 6, 27, 43, -11]

for num in numbers:
    if num < 10:
        print(num * number)

Der Code ist nicht besonders spannend. Der Nutzer gibt eine Zahl ein, die mit jeder Zahl in der Liste multipliziert werden soll, die kleiner als 10 ist. Wird die Zahl 2 eingegeben, dann müsste also als Ergebnis

4
12
-22

ausgegeben werden.

Das ist aber nicht der Fall. Stattdessen erscheint als Ergebnis:

22
222222

Mit print() könnte man dem auf die Schliche kommen. Interessanter ist aber die Funktion breakpoint(), die hier zur if-Verzeigung hinzugefügt wird:

number = input("Bitte geben Sie eine Zahl ein: ")

numbers = [2, 15, 33, 6, 27, 43, -11]
result = []

for num in numbers:
    if num < 10:
        breakpoint()
        print(num * number)

Wird der Code jetzt ausgeführt, führt dies zu folgender Ausgabe:

Bitte geben Sie eine Zahl ein: 2
> /Users/bodo/Desktop/Testing/breakpoint_example.py(21)<module>()
-> print(num * number)
(Pdb)

Es started der Python Debugger (pdb), der hinter (Pdb) eine Eingabe erwartet. Es besteht nun beispielsweise die Möglichkeit, die Variable num abzufragen. Da die for-Schleife zum ersten Mal durchlaufen wird, führt die Eingabe von num dazu, dass der erste Wert der Liste numbers angezeigt wird, mithin der Wert 2.

(Pdb) num
2

Betrachten wir als nächstes die Variable number:

(Pdb) number
'2'

Hier wurde die Zahl „2“ eingegeben. Wie zu erwarten gewesen ist, wird auch „2“ angezeigt, jedoch von einfachen Anführungszeichen umschlossen. Dies legt den Verdacht nahe, dass es sich hierbei um den Datentyp str handelt. Die Verwendung von type() bestätigt dies:

(Pdb) type(number)
<class 'str'>

Und damit erklärt sich auch das obige Ergebnis: Denn 2 * ‚2‘ ergibt führt in der Tat dazu, dass der Wert 2 zweimal ausgegeben wird, also das Ergebnis „22“ lautet. Um als Ergebnis 4 zu erhalten, müssten zwei Werte vom Typ int multipliziert werden. Eine explizite Umwandlung des Datentyps von str zu int macht dies möglich:

number = input("Bitte geben Sie eine Zahl ein: ")

numbers = [2, 15, 33, 6, 27, 43, -11]

for num in numbers:
    if num < 10:
        print(num * int(number))  # <- Umwandlung von str zu int

Es gibt eine ganze Reihe von Debugger-Befehlen, die man mit h(elp) abrufen kann. Häufig genutzt werden, dürfte n(ext). Dieser Befehl führt die Ausführung des Programms bis zur nächsten Zeile fort. Darüber hinaus sollte man auch einen Blick in die Dokumentation werfen, in der die zur Verfügung stehenden Befehle erklärt werden.

Der Python-Debugger pdb kann auch über die Kommandozeile aufgerufen werden. Angenommen, voranstehender Code würde in der Datei „example.py“ gespeichert werden, dann würde die Anweisung wie folgt aussehen:

$ python3 -m pdb example.py

Dieses kleine Beispiel zeigt, wie nützlich breakpoint() ist. Falls Ihr bisher intensiv print() genutzt habt, solltet Ihr Euch jetzt überlegen, ob Ihr nicht dem Python-Debugger pdb den Vorzug geben wollt.