Python 3.7 – Ausbau der Autobahn

Seite 2: Built-in breakpoint PEP 553

Inhaltsverzeichnis

Den Debugger im Programm an einer bestimmten Stelle zu starten, ging bisher etwas umständlich nur über das Modul "pdb".

import pdb

pdb.set_trace()

Die neue Version bietet eine fest eingebaute Funktion (built-in): breakpoint übernimmt diese Aufgabe, ähnlich des Aufrufs debugger in JavaScript:

print('Ohne Debugger')

breakpoint()

print('Mit Debugger')

Wer einen anderen Debugger als pdb einsetzen möchte, kann entweder die Funktion sys.breakpointhook() auf einen anderen Aufruf umdefinieren oder die Umgebungsvariable PYTHONBREAKPOINT setzen.

PYTHONBREAKPOINT='web_pdb.set_trace'

Anschließend ruft Python automatisch beim Verwenden von breakpoint() die Funktion set_trace auf, nachdem es das Modul "web_pdb" importiert hat. Mit dem Modul können Entwickler das Debuggen in einem Webbrowser durchführen – zu installieren mit pip install web-pdb, der auf demselben Rechner wie das Python-Programm oder einem anderen über HTTP verbundenen Rechner laufen muss.

os.environ['PYTHONBREAKPOINT'] = 'web_pdb.set_trace'

Wie jede andere Umgebungsvariable können Entwickler PYTHONBREAKPOINT während des Programmlaufs neu setzen und dadurch auf einen gewünschten Debugger umschalten. Hat die Umgebungsvariable PYTHONBREAKPOINT den Wert 0, ist das Debuggen mit breakpoint() grundsätzlich ausgeschaltet. Der Aufruf hat somit keine Wirkung.

Für einige Funktionen im Modul "time" gibt es neuerdings eine auf Nanosekunden genaue Variante, die an der der Endung _ns() zu erkennen ist:

clock_gettime_ns()
clock_settime_ns()
monotonic_ns()
perf_counter_ns()
process_time_ns()
time_ns()

Wie hoch die Genauigkeit dieser Funktionen tatsächlich ist, hängt vom jeweiligen System ab. Laut Angaben zur neuen Python-Version soll die Auflösung der Funktion time.time_ns dreimal besser sein als time.time, zumindest auf Linux und Windows.

Ein weiterer, nicht zu unterschätzender Vorteil dieser neuen Funktionen: Sie liefern als Rückgabewerte Zahlen vom Typ int und nicht float, wie ihre Vorgänger. Bei sehr vielen Rechenvorgängen kann es bei float in den letzten Nachkommastellen zu Ungenauigkeiten kommen (siehe PEP 564). Bei Zahlen vom Typ int ist das nicht der Fall.

import time

t1 = time.time()
print(t1,type(t1))

t2 = time.time_ns()
print(t2, type(t2))

>> 1525515118.119379 <class 'float'>
>> 1525515118119397000 <class 'int'>