51 Punkte von GN⁺ 2025-04-24 | 5 Kommentare | Auf WhatsApp teilen
  • Stellt 14 wenig bekannte fortgeschrittene Funktionen in Python anhand praktischer Beispiele vor
  • Bietet eine tiefgehende Erklärung zu statischer Typisierung und strukturellem Design wie typing, generics, protocols und context managers
  • Enthält außerdem strukturelles Pattern Matching, das ab Python 3.10 neu eingeführt wurde, sowie Performance-Optimierungstechniken wie Slots und Metaklassen
  • Beinhaltet Tipps für saubereren Code wie f-string, cache, future, proxy, for-else und walrus
  • Zu jeder Funktion gibt es Links und Referenzmaterial für weiterführendes Lernen, mit einer Struktur, die auch für Junior-Entwickler leicht zugänglich ist

Zusammenfassung von 14 fortgeschrittenen Python-Funktionen

# Typing-Overload

  • Der Decorator @overload ermöglicht es, mehrere Typsignaturen für eine einzelne Funktion zu definieren
  • Type-Checker können abhängig von den übergebenen Argumentwerten den Rückgabetyp präzise ableiten
  • Mit Literal lässt sich auch eine Einschränkung auf bestimmte String-Werte umsetzen
  • Es lassen sich auch Funktionssignaturen implementieren, die genau eines von id oder username verlangen
  • Literal kann als leichtgewichtige Enum-Alternative für Typsicherheit genutzt werden

# Keyword-only-/Positional-only-Argumente

  • Mit * lassen sich Keyword-only-Argumente festlegen (Positionsargumente sind nicht erlaubt)
  • Mit / lassen sich Positional-only-Argumente festlegen (Keyword-Argumente sind nicht erlaubt)
  • Beim API-Design kann damit die Verwendung von Argumenten klar erzwungen werden

# Future-Annotationen (__future__)

  • Da Type Hints ursprünglich zur Laufzeit sofort ausgewertet werden, entstehen Probleme mit der Reihenfolge von Deklarationen
  • Mit from __future__ import annotations lässt sich der Zeitpunkt der Auswertung verzögern
  • Da dies jedoch auf String-Verarbeitung basiert, ist bei der Verwendung von Typen zur Laufzeit Vorsicht geboten
  • PEP 649 schlägt eine Verbesserung durch verzögerte Auswertung über das Attribut __annotations__ vor

# Generic-Syntax

  • Ab Python 3.12 wird eine neue Syntax zur Definition generischer Typen unterstützt
  • Statt TypeVar ist eine intuitivere Form wie class Foo[T, U: int] möglich
  • Auch Variadic Generics wurden eingeführt und erlauben die Verarbeitung verschiedener Typen
  • Die Definition von Type Aliases wurde ebenfalls vereinfacht, etwa in der Form type Vector = list[float]

# Protocols

  • Als typisierte Variante von Duck Typing lässt sich strukturelles Subtyping umsetzen
  • Wenn eine Klasse bestimmte Methoden besitzt, ist Typkompatibilität auch ohne Type-Vererbung möglich
  • Mit @runtime_checkable lässt sich dies auch auf isinstance-Prüfungen erweitern

# Context Manager

  • Objekte mit den Methoden __enter__ und __exit__ werden in with-Blöcken verwendet
  • Mit dem Decorator contextlib.contextmanager ist eine einfache funktionsbasierte Implementierung möglich
  • Rund um yield werden Setup- und Cleanup-Arbeiten ausgeführt

# Strukturelles Pattern Matching

  • Mit der Syntax match-case lassen sich komplexe Datenstrukturen intuitiv verzweigen und verarbeiten
  • Tupel-/Listen-Destrukturierung, OR-Patterns, Guard-Bedingungen (if) und Wildcards sind möglich
  • Da Verzweigungen anhand der Struktur von Daten erfolgen, werden Lesbarkeit und Wartbarkeit verbessert

# __slots__-Optimierung

  • Durch die Verwendung fester Slots statt __dict__ werden Speicherverbrauch und Geschwindigkeit optimiert
  • __slots__ verwendet ein Tupel, das nur Attributnamen enthält
  • Verhindert das Hinzufügen unnötiger Attribute zu Klassen
  • Allerdings handelt es sich um eine Mikro-Optimierung, daher ist ein überlegter Einsatz nötig

# Sammlung von Python-Code-Style-Tipps

  • for-else-Konstrukt: else wird ausgeführt, wenn die Schleife ohne break endet
  • Walrus-Operator (:=): Variablendeklaration und Prüfung gleichzeitig möglich
  • Kurzschlussauswertung mit or: Gibt unter mehreren Werten den ersten wahrheitsgemäßen zurück
  • Verkettung von Vergleichsoperatoren: Mit 0 < x < 10 lässt sich Code kompakter schreiben

# Fortgeschrittenes f-string-Formatting

  • Mit der Syntax f"{변수=}" sind Ausgaben für Debugging-Zwecke möglich
  • Verschiedene Optionen wie Zahlenformatierung (:.2f, :+.2f, :,) und Datumsformatierung (%Y-%m-%d) werden unterstützt
  • Auch Format-Mini-Sprache wie Zentrierung, Padding und Prozentdarstellung kann genutzt werden

# Cache-Decorator

  • Mit @lru_cache und @cache werden Funktionsergebnisse gespeichert, um die Geschwindigkeit zu erhöhen
  • Besonders nützlich bei rekursiven Funktionen oder häufig wiederholten Berechnungen
  • @cache wurde ab Python 3.9 eingeführt und bietet standardmäßig unbegrenzten Cache

# Python Future

  • Eine Funktion zur Verarbeitung asynchroner Objekte, ähnlich wie Promises in JS
  • Mit Future.set_result() und add_done_callback() lassen sich Ergebnisse asynchron verwalten
  • asyncio.Future() kann zusammen mit await verwendet werden
  • In Verbindung mit ThreadPoolExecutor ist auch parallele Verarbeitung im Hintergrund möglich

# Proxy-Property

  • Erlaubt, dass ein einzelnes Klassenattribut sowohl wie ein Attribut als auch wie eine Funktion funktioniert
  • Über __get__, __call__ und __repr__ werden beide Funktionen bereitgestellt
  • Beim API-Design können so Standardwerte und parameterisierte Aufrufe in einer einzigen Form behandelt werden
  • Eher als experimentelles Beispiel interessant als für den praktischen Einsatz

# Metaklassen

  • Die Klasse einer Klasse, die Klassen selbst erzeugt
  • Ermöglicht Meta-Logik wie das Manipulieren von Klassenattributen oder automatische Registrierung
  • In der Praxis meist durch Decorators ersetzbar
  • In Django, SQLAlchemy und Pydantic werden Metaklassen intern verwendet

5 Kommentare

 
hackerpropoker 2025-04-29

Aus Backend-Sicht habe ich die Erfahrung gemacht, dass Metaklassen das Debugging erschweren.

 
ilotoki0804 2025-04-28

Beachten Sie, dass for-else häufig als Anti-Pattern gilt, da es nach Ansicht vieler weder die Lesbarkeit noch die Klarheit erhöht, und dass asyncio.Future als internes Implementierungsdetail von asyncio betrachtet wird.

 
dkmin 2025-04-26

Danke. Insbesondere Punkt 10 setze ich sofort um.

AI-Coding-Regeln hinzugefügt..

 
yangeok 2025-04-25

Danke für den tollen Tipp.

 
GN⁺ 2025-04-24
Hacker-News-Kommentare
  • Hallo! Ich bin der Originalautor des Blogposts! Ich war überrascht, als ich um 4 Uhr morgens sah, dass mein Beitrag auf der HN-Startseite gelandet war

    • Dieser Artikel begann als 14 kleine Tweets, die ich einen Monat vor dem Start des Blogs geschrieben hatte
    • Als ich den Blog startete, entschied ich mich, diese Tweets als ersten Beitrag wiederzuverwenden
    • Deshalb könnte sich der Aufbau etwas merkwürdig anfühlen
    • Montags wollte ich etwas Nützliches finden, freitags etwas eher Ausgefallenes
    • Der Titel ist genauso entstanden: Es ist einfach eine Sammlung von 14 Features, die ich bei der Nutzung von Python interessant fand
    • Ich habe vielleicht nur etwa 5 Sekunden auf den Titel verwendet
  • Jedes Mal, wenn ich Python benutze, mache ich mir Sorgen, ob mein Code so aussieht, als würde ich Python falsch verwenden

    • Ich bin immer wieder erstaunt über tiefgehende Inhalte oder Änderungen an Python, von denen ich nichts wusste
    • Go gibt mir die Sicherheit, dass mein Code auch in einigen Jahren nicht veraltet wirken wird
    • Großartiger Artikel
  • Python sollte Python bleiben, und golang, Rust und Typescript sollten jeweils ihre eigene Philosophie und ihr eigenes Design haben

    • Ich programmiere seit 28 Jahren in vier Sprachen, und mir gefallen die Veränderungen an Python nicht
    • Python wurde nicht wegen zusätzlicher Schichten wie Type Checking oder Annotationen populär
    • Ähnliches habe ich auch in anderen Sprachen gesehen
    • Das ist eine umfassende Liste kürzlich eingeführter Features
    • Es gibt auch eine frühere Liste, die Leser nützlich finden könnten
  • Der größte Vorteil von Python ist, dass es sich wie ausführbarer Pseudocode anfühlt

    • Die Sprache steht Anweisungen auf Domänenebene nicht im Weg
    • Je mehr Features hinzugefügt werden, desto weniger attraktiv wird sie
    • Die meisten Menschen verstehen Python nicht in der Tiefe
  • Hinweis zu Abschnitt 9.3 Auswertung: Bei einem leeren String fällt die Auswertung anders aus

    • Die if-else-Klausel behandelt den leeren String als gültig, aber der or-Operator behandelt ihn als gleichwertig zu None
  • Als jemand, der von Javascript/Typescript zu Python gewechselt ist, ist das eine nützliche Ressource

    • Typing-Overloads sind für ein unglückliches Feature von Javascript gedacht und betrachte ich als technische Schulden
    • Bei keyword-only- und positional-only-Argumenten mache ich mir Sorgen um die Lesbarkeit, weil die Syntax zu knapp ist
    • Future-Anmerkungen haben mir in letzter Zeit sehr geholfen
    • Protokolle ähneln Typescript, wirken aber nicht sehr Python-typisch
    • Metaklassen sind ein mächtiges Werkzeug, das einzigartige Probleme lösen kann
  • Die meisten Features sind keine Advanced Features

    • Metaklassen können komplexes Verhalten hervorrufen, deshalb vermeide ich sie eher
    • 'Proxy-Eigenschaften' sind kein Feature
  • Was ich an der Liste ändern würde, ist die Aufnahme von collections.abc-Containern

    • Viele Kommentare mochten den Walrus-Operator nicht, aber nachdem ich gute Einsatzmöglichkeiten gefunden hatte, benutze ich ihn nützlich
    • Beim Einsatz von Regular-Expression-Patterns wird der Code viel sauberer
  • Es hat Spaß gemacht, diesen Artikel zu lesen

    • Die meisten Features sind Features des typing-Moduls
    • Bei Generics oder Protokollen war ich mir nicht sicher
    • Ich frage mich, ob moderner Python-Produktionscode überall Typen verwendet