Thema: python
-
Python 3.10 nach dem Supportende: Laufzeiten finden und Umgebungen neu aufbauen
Die Lebenszyklustabelle des Python-Projekts nennt den 1. Oktober 2026 als Supportende für Python 3.10. Die tatsächlich von Diensten, virtuellen Umgebungen und Images verwendeten Interpreter erfassen, dann jede Anwendung auf einem unterstützten Versionszweig neu aufbauen und testen.
-
Ein Python-Kommandozeilenwerkzeug entwerfen: argparse, main() und Exit-Codes
Die Schnittstelle in eine als Console-Script registrierte Funktion main(argv) -> int legen, mit type und choices von argparse validieren, der Exit-Code-Konvention folgen (0 Erfolg, 2 Nutzungsfehler, 1 sonstiger Fehler, sysexits-Codes nur wenn dokumentiert), Ergebnisse auf stdout und Diagnosemeldungen auf stderr ausgeben sowie SIGINT und abgebrochene Pipes behandeln.
-
Ein Konfidenzintervall für Median, Perzentil oder Verhältnis per Bootstrap bestimmen
Die Rohbeobachtungen viele Male mit Zurücklegen resamplen, die Statistik für jede Stichprobe berechnen und das Intervall aus der resultierenden Verteilung ablesen; das liefert eine Unsicherheit für Mediane, Perzentile, Verhältnisse und Differenzen, für die keine Lehrbuchformel gilt. Methode, Anzahl der Resamples und Stichprobengrösse angeben, und bei extremen Perzentilen kleiner Stichproben nicht darauf vertrauen.
-
Veröffentlichungsidentitäten bei npm und PyPI an freigegebene Release-Artefakte binden
Trusted Publishing mit OIDC beseitigt gespeicherte Veröffentlichungs-Tokens, seine Sicherheit hängt aber weiterhin vom autorisierten Workflow ab. Build und Veröffentlichung trennen, Freigaben schützen und die Identität des Artefakts prüfen, ohne einen Herkunftsnachweis als Urteil über Schadsoftware zu behandeln.
-
Property-based Testing mit generierten Eingaben
Statt handverlesener Beispiele formuliert ein Property-based Test eine Invariante und lässt eine Bibliothek viele Eingaben generieren, wobei Fehlschläge auf minimale Gegenbeispiele verkleinert (shrinking) werden; Hypothesis ist die Referenzimplementierung für Python.
-
Kontextmanager in Python: Aufräumen garantieren
Die with-Anweisung führt __enter__ und __exit__ um einen Block herum aus, sodass Dateien, Sperren und Verbindungen auch bei einer Ausnahme freigegeben werden; contextlib.contextmanager macht aus einem Generator einen Kontextmanager.
-
Docstrings, die Werkzeuge und Leserinnen und Leser nutzen können
PEP 257 legt fest, wo Docstrings stehen und wie sie formatiert werden; ein einheitlicher Stil (Google oder NumPy) mit einzeiliger Zusammenfassung, Beschreibung von Argumenten und Rückgabewerten sowie ausgelösten Ausnahmen macht sie für Lesende, Editoren und Dokumentationsgeneratoren nutzbar.
-
Gleitkommazahlen: warum 0.1 + 0.2 nicht 0.3 ergibt
Binäre Gleitkommazahlen stellen die meisten Dezimalbrüche nur näherungsweise dar, sodass sich bei Rechnungen Rundungsfehler ansammeln; mit Toleranzen vergleichen, sorgfältig summieren, für Geldbeträge und Zählwerte Ganzzahlen oder Decimal-Typen verwenden und mit genügend Nachkommastellen ausgeben, damit ein Roundtrip gelingt.
-
YAML sicher laden
Volle YAML-Loader können aus getaggten Knoten beliebige Objekte instanziieren; stets einen sicheren Loader verwenden, die YAML-Versionssemantik festnageln und das Ergebnis vor der Verwendung gegen ein Schema validieren.
-
Glob-Dialekte: Was * und ** in .gitignore, .dockerignore, Bash, Python und GitHub Actions bedeuten
Dieselben Zeichen * und ** bedeuten je nach Auswertungsort etwas anderes: Ein Muster ohne Schrägstrich in .gitignore greift in jeder Tiefe, dieselbe Zeile in .dockerignore nur im Wurzelverzeichnis des Kontexts. Die Rekursion über globstar in Bash muss aktiviert werden, und fnmatch in Python kennt keine Pfadlogik.
-
Wann asyncio hilft und wann nicht
asyncio führt viele E/A-lastige Aufgaben auf einem Thread aus, indem es an await-Punkten pausiert; es beschleunigt CPU-lastigen Code nicht, und blockierende Aufrufe innerhalb von Coroutinen legen die gesamte Event-Loop lahm.
-
Automatisierte Formatierung und Linting als Team-Vereinbarung
Layout an einen Formatter und mechanische Prüfungen an einen Linter zu delegieren, nimmt Stildiskussionen aus dem Review; EditorConfig, PEP 8 und Werkzeuge wie Ruff zeigen, wie sich die Vereinbarung im Repository festhalten lässt.
-
Protocol-Klassen: strukturelle Typisierung für duck-typed Python
Eine typing.Protocol deklariert die Methoden und Attribute, die eine konsumierende Stelle braucht; jedes Objekt, das sie besitzt, erfüllt den Typ, ohne davon zu erben. Protokolle neben dem Code definieren, der von ihnen abhängt, sie minimal halten und runtime_checkable nur dort einsetzen, wo isinstance wirklich gebraucht wird.
-
Einen Memory Leak mit tracemalloc-Snapshots finden
Das Tracing früh mit PYTHONTRACEMALLOC oder tracemalloc.start(nframe) starten, nach dem Aufwärmen einen Snapshot nehmen und einen weiteren nach N Iterationen, Import-Rauschen herausfiltern und compare_to(..., 'lineno') nach Zeilen absuchen, deren Grösse proportional zu N wächst; für die Aufrufer auf die Gruppierung 'traceback' wechseln.
-
Geld und andere exakte Grössen: Decimal statt float verwenden
Binäre Gleitkommazahlen können die meisten dezimalen Brüche nicht exakt darstellen, sodass Summen von Preisen driften; das Modul decimal bietet exakte Dezimalarithmetik mit expliziter Rundung, und Ganzzahlen in Kleinsteinheiten sind eine Alternative.
-
Zwischen Threads, Prozessen und asyncio für eine Python-Arbeitslast wählen
Zuerst den Hot Path klassifizieren: Warten auf I/O passt zu asyncio (viele Verbindungen, asynchrone Bibliotheken) oder zu einem Thread-Pool (wenige blockierende Aufrufe); reine Python-CPU-Arbeit braucht Prozesse oder einen Free-Threaded-Build; nativer Code, der das GIL freigibt, kann Threads nutzen. Jeden Pool begrenzen, die Prozess-Startmethode explizit wählen und den Abschaltpfad schreiben.
-
Dataclasses für einfache Records
dataclasses erzeugen __init__, __repr__ und Gleichheit aus annotierten Feldern; frozen dataclasses ergeben unveränderliche Werteobjekte, slots reduzieren den Speicherbedarf, und field(default_factory=...) vermeidet geteilte veränderliche Defaultwerte.
-
Bei welcher Arbeitslast übertrifft der Free-Threaded-CPython-Build einen Prozess-Pool für einen gemischten E/A- und CPU-Dienst?
Offene Frage: Der Free-Threaded-Build entfernt den GIL, fügt aber Overhead im Einzelthread-Betrieb hinzu und kann beim Import einer nicht vorbereiteten Extension auf den GIL zurückfallen, während Prozess-Pools für Pickling und Speicherverdopplung bezahlen; bei welchen Verhältnissen von CPU-Zeit zu Wartezeit, welchen Working Sets und welchen Kernzahlen liefert ein Thread-Pool auf dem Free-Threaded-Build mehr Durchsatz pro Kern?
-
Eine Aufgabe vor dem Lesen ihrer Musterlösung zu versuchen, ergibt eine bessere einmonatige Erinnerung an ein Sprachfeature als zuerst die Lösung zu lesen
Hypothese: Für eine Entwicklerin, die ein bestimmtes Sprachfeature lernt, etwa Pythons match-Anweisung, führt das Bearbeiten einer Aufgabe vor dem Betrachten der Musterlösung zu besserer verzögerter Erinnerung und besserem Transfer als zuerst die Lösung zu studieren und danach eine ähnliche Aufgabe zu bearbeiten; ein vorgeschlagener Within-Person-Test mit zwei Features, zwei Reihenfolgen und einem einmonatig verzögerten Test, ohne behauptetes Ergebnis.
-
asyncio-Abbruch: Aufräumen durchführen, ohne CancelledError zu verschlucken
Den Abbruch für die aufgabenbesitzende Stelle sichtbar halten und dabei auf dem unterbrochenen Pfad Ressourcen freigeben.
Maschinenlesbar: JSON