Geschichte des Themas: Typannotationen wurden in Python 3.5 (PEP 484) eingeführt, um die statische Codeanalyse, Autovervollständigung, Refactoring und Auto-Dokumentation zu unterstützen. Zuvor kam Python ohne strikte Typisierung erfolgreich aus, aber mit dem Wachstum von Projekten und Teams wurden sie notwendig, um die Codequalität zu erhöhen.
Problem: Typannotationen sind nur Hinweise für Entwickler und externe Werkzeuge (mypy, Pyright usw.), der Interpreter ignoriert sie während der Ausführung. Fehler treten häufig auf, wenn:
Lösung: Verwenden Sie Typannotationen für Funktionen und Variablen zur Verbesserung der Lesbarkeit, zur Codeanalyse durch Linter und IDEs. Man sollte sich nicht ausschließlich auf Annotationen verlassen – ein statischer Typprüfer ist erforderlich. Beispiel:
def greeting(name: str) -> str: return f"Hello, {name}" def sum_nums(nums: list[int]) -> int: return sum(nums)
Komplexere Beispiele verwenden das Typing-Modul:
from typing import List, Dict, Optional def process(data: List[Dict[str, Optional[int]]]) -> None: ...
Wichtige Merkmale:
Verarbeitet der Python-Interpreter Typen aus Annotationen zur Laufzeit?
Nein. Annotationen sind über __annotations__ verfügbar, beeinträchtigen jedoch nicht das Verhalten zur Laufzeit.
Kann man Variablen ohne Annotationen in annotierten Funktionen verwenden?
Ja. Annotationen sind nicht obligatorisch, aber ihr Fehlen kann verwirrend sein.
Kann man den Typ einer Variablen nach der Annotation überschreiben?
Ja, aber das verletzt den Sinn der statischen Analyse und stört Linter. Man sollte so etwas vermeiden:
x: int = 5 x = 'string' # Der Linter wird meckern, aber der Code wird ausgeführt.
Negativer Fall: Eine Funktion wird annotiert, gibt jedoch tatsächlich einen Typ zurück, der von der Annotation abweicht, aufgrund einer Änderung der Logik der Funktion. Vorteile:
Positiver Fall: Alle Funktionen und Daten sind annotiert, das Projekt wird bei CI/CD mit mypy überprüft. Vorteile: