EMZETT.
Login

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/TypeVar fü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.py

mypy --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