Faragiri

Die Standardbibliothek lernen Python

Ein Kommandozeilen-Parser, eine Zeitzone mit Zeitumstellung, Gruppieren ohne Schleife, und das Modul, das ein eigenes Zufalls-Token überflüssig macht.

4Abschnitte
3Min. Lesezeit
4Tiefe

Sechs Importe, keine Abhängigkeit

Wofür jedes Modul da ist, gruppiert nach der Aufgabe

Jeder Ast hier ist etwas, wofür Leute ein Paket installieren, und jedes Blatt daran ist schon auf der Maschine.

  • Argumente entgegennehmenEin Skript, das andere ausführen
    • argparse: Flags, Typen und eine Nutzungszeile gratis
  • Schleifen, die man gerade schreiben wollteGruppieren, paaren, zerteilen
    • itertools.groupby: erst nach dem Schlüssel sortieren, sonst gruppiert es zweimal
    • itertools.pairwise: aufeinanderfolgende Paare, seit Python 3.10
    • itertools.batched: Stücke, und das kurze letzte wird korrekt behandelt
  • Es auf den Bildschirm bringenBreiten, und Platz auf der Platte
    • textwrap: schneidet an einer Wortgrenze
    • shutil: freie Bytes, vor dem Schreiben statt nach dem Absturz
bereits installiert
  • Zeit, die keine Arithmetik istZeitzonen, auch die mit einer Zeitumstellung
    • zoneinfo: Europe/Berlin, keine Zahl von Stunden
  • Alles, was ein Fremder siehtToken, Links, Reset-URLs
    • secrets: kein Zufall, der aus seiner Ausgabe vorhersagbar ist

Die Äste sind Aufgaben statt Kategorien, weil der Modulindex andersherum sortiert ist, und genau deshalb findet das hier niemand. Ein Ast, der in dieser Abbildung fehlt, ist alles, was ein Netzwerk braucht, denn dort fängt eine echte Abhängigkeit erst an.

Die meisten kleinen Abhängigkeiten in einem Python-Projekt ersetzen etwas, das schon installiert ist. Sechs Module decken den Großteil davon ab, und jedes ist ein Import ohne Version zum Anheften und ohne etwas, das am Tag kaputtgeht, an dem es nicht mehr gepflegt wird.

argparse macht aus einem Skript einen Befehl. ap.add_argument("--limit", type=int, default=50) und ein ungültiger Wert bricht ab mit invalid int value: 'viele', nachdem die Nutzungszeile gedruckt wurde, bevor der eigene Code überhaupt läuft. action="store_true" ergibt ein --probelauf-Flag, und das Parsen von ["beete", "--probelauf"] beantwortet Namespace(ordner='beete', probelauf=True, limit=50). Man beachte den Unterstrich: ein Bindestrich im Flag wird zum Unterstrich im Attribut.

zoneinfo kümmert sich um den Teil der Zeit, der keine Arithmetik ist, und in Deutschland ist das vor allem die Zeitumstellung. In der Nacht, in der die Sommerzeit endet, existiert 02:30 Uhr zweimal, einmal in Sommerzeit und einmal in Winterzeit, und dt.fold unterscheidet die erste 02:30 Uhr von der zweiten. Wer hier eine ganze Zahl von Stunden statt ZoneInfo("Europe/Berlin") benutzt, hat eine Bewässerung, die in dieser einen Nacht doppelt oder gar nicht läuft.

Drei, die eine Schleife ersetzen, die man gerade schreiben wollte

itertools.groupby fasst eine Gruppierungsschleife zusammen, mit einer Bedingung, die alle erwischt: es gruppiert nur bereits benachbarte Läufe, die Zeilen müssen also vorher nach demselben Schlüssel sortiert sein. Auf sortierten Beetzeilen liefert es Beet A mit ['Salat', 'Radieschen'] und dann Beet B. Unsortierte Eingaben erzeugen denselben Schlüssel stillschweigend zweimal.

itertools.pairwise ergibt aufeinanderfolgende Paare: [(120, 128), (128, 135), (135, 141)] aus vier Zählerständen, was jede Schleife für die Differenz zwischen benachbarten Werten ersetzt, in einem Aufruf, seit Python 3.10. itertools.batched teilt eine Sequenz in Stücke: [('A', 'B', 'C'), ('D', 'E', 'F'), ('G',)], und das kurze letzte Stück ist genau der Fall, den ein selbstgeschriebener Zerteiler falsch macht.

Eine, die eine Sicherheitsentscheidung ist, keine Bequemlichkeit

secrets ist das Modul, das man beim Namen kennen sollte. secrets.token_urlsafe(16) liefert eine 22 Zeichen lange Zeichenkette, sicher für eine URL, gezogen aus der kryptografischen Quelle des Betriebssystems. Das random-Modul ist das nicht: es ist schnell, reproduzierbar und vorhersagbar aus seiner eigenen Ausgabe, was für das Mischen eines Kartenspiels genau richtig ist und für einen Link zum Zurücksetzen eines Passworts genau falsch. random dort zu benutzen, wo secrets hingehört, ist eine echte Schwachstelle, an der kein Test scheitert, und deshalb gibt es die beiden Module getrennt.

textwrap und shutil füllen die Lücken darum. textwrap.shorten(text, width=24, placeholder=" ...") ergibt ein sehr langes Beetetikett ..., geschnitten an einer Wortgrenze statt mitten im Wort, und shutil.disk_usage("/").free beantwortet den freien Platz in Bytes, was ein Skript, das Dateien schreibt, vor dem Start prüfen sollte statt nach einem Absturz.

Was 2026 den Unterschied macht

Der Modulindex der Standardbibliothek ist das Werkzeug, kostenlos, und die Gewohnheit, die sich lohnt, ist, ihn vor einer Abhängigkeit zu öffnen statt danach. Er hat das Suchen nach einem Paket zuerst abgelöst, das zuverlässig eines findet, weil für fast alles in dieser Liste schon jemand ein Paket veröffentlicht hat.

Python 3.14 ist die Version, die diese Beispiele voraussetzen, kostenlos und quelloffen. Drei der sechs Module oben haben die hier genannte Funktion erst nach 2020 bekommen, sodass eine auf eine alte Version festgelegte Codebasis weniger davon hat, als diese Seite nahelegt, und ein Blick in die Versionshinweise der Dokumentation ist eine Gewohnheit von zehn Sekunden, die einen verwirrenden Importfehler verhindert.

Wo diese Lücke am größten ist

Der Stolperstein ist, nicht zu wissen, wonach man suchen soll, was keine Lektüre direkt behebt. Niemand sucht nach pairwise, ohne das Wort zu kennen, und die Schleife, die Differenzen zwischen aufeinanderfolgenden Messwerten berechnet, wird deshalb hundertmal von Hand geschrieben, weil sie leicht genug ist, um sie einfach zu schreiben.

Was hilft, ist, die Indexseite eines Moduls zu lesen, sobald man eine Schleife schreibt, die sich generisch anfühlt. Eine Schleife, die gruppiert, zerteilt, paart oder zählt, ist eine von acht Funktionen in itertools und collections, und fünfzehn Minuten mit diesen beiden Indexseiten sind die Lektüre mit dem höchsten Ertrag in dieser Sprache. Welche Wendungen diese Funktionen ersetzen, steht bei Python-Grundlagen, und was zu tun ist, wenn die Antwort wirklich eine Abhängigkeit ist, klärt Pakete und Umgebungen.

Daneben

Darüber