Typannotationen in Python: Type Hints und mypy
Kurz: Type Hints beschreiben, welche Typen Funktionen erwarten und liefern; Python prüft sie nicht selbst, aber Editoren und Werkzeuge wie mypy finden Fehler vor dem Ausführen.
Genauer: Python ist dynamisch typisiert: Typen werden zur Laufzeit bestimmt. Seit Python 3.5 kann man Typannotationen angeben. Sie sind Dokumentation und Prüfhilfe, ändern aber das Laufzeitverhalten nicht.
Im Detail
Grundlagen
def begruessen(name: str, anzahl: int = 1) -> str:
return ("Hallo " + name + "! ") * anzahl
preise: dict[str, float] = {"Spiel": 12.5}
namen: list[str] = []
koordinate: tuple[int, int] = (3, 4)Moderne Schreibweise ab 3.9/3.10: list[int], dict[str, int], int | None (statt Optional[int]), X | Y für Unions. None-Rückgaben: -> None. Bei Funktionen ohne Rückgabe nicht -> any verwenden.
Nützliche Typen
Optional[T]/T | None: Wert oder nichts.Union,Literal["a", "b"],Any(schaltet Prüfung ab).Callable[[int], str]für Funktionen,Iterable,Sequence,Mapping.TypedDict,NamedTuple,dataclass,Protocol(strukturelle Typisierung/„Duck Typing“ mit Prüfung).Generic/TypeVarfür generische Funktionen/Klassen:def erstes(xs: list[T]) -> T.Final,ClassVar,Self,override.- Typaliasse:
Preis = float,type Punkt = tuple[int, int](3.12).
Prüfen mit mypy/pyright
pip install mypy
mypy meine_datei.pymypy --strict ist streng; schrittweise einführen (Gradual Typing). Editoren (VS Code mit Pylance/pyright, PyCharm) zeigen Fehler live. Beispiel: begruessen(5) meldet „Argument 1 hat inkompatiblen Typ int; erwartet str“, bevor das Programm läuft. In CI laufen lassen. Bibliotheken ohne Typen: types-…-Pakete (Stubs). # type: ignore sparsam.
Nutzen und Grenzen
- Vorteile: weniger Fehler (None-Fehler!), bessere Autovervollständigung, Lesbarkeit, Refactoring-Sicherheit; Basis für Frameworks wie FastAPI/pydantic (Typen werden zur Laufzeit zur Validierung genutzt).
- Grenzen: Laufzeit prüft nichts; falsche Annotation lügt; sehr dynamischer Code lässt sich schwer typisieren.
- Praxis: öffentliche Funktionen und Schnittstellen annotieren, interne kleine Skripte nicht zwingend.
- Vergleich: TypeScript (JS), Java/C# (statisch) – Python ist optional typisiert.
- Prüfung/Lernen: Typfehler vor dem Ausführen finden; mit
reveal_type(x)in mypy nachsehen.
Siehe auch: Dataclasses und Properties, TypeScript, Linter, Formatter und Typprüfer