Historia pytania: Adnotacje typów pojawiły się w Pythonie 3.5 (PEP 484) w celu wsparcia statycznej analizy kodu, autouzupełniania, refaktoryzacji i auto-dokumentacji. Wcześniej Python dobrze radził sobie bez ścisłej typizacji, ale wraz ze wzrostem projektów i zespołów stały się one niezbędne do poprawy jakości kodu.
Problem: Adnotacje typów są tylko sugestiami dla programistów i zewnętrznych narzędzi (mypy, Pyright itd.), sam interpreter ignoruje je podczas wykonywania. Błędy często występują, jeśli:
Rozwiązanie: Używaj adnotacji typów dla funkcji i zmiennych dla ułatwienia czytelności, analizy kodu przez lintery i IDE. Nie należy polegać wyłącznie na adnotacjach — potrzebny jest statyczny kontroler typów. Przykład:
def greeting(name: str) -> str: return f"Hello, {name}" def sum_nums(nums: list[int]) -> int: return sum(nums)
Bardziej złożone przykłady używają modułu typing:
from typing import List, Dict, Optional def process(data: List[Dict[str, Optional[int]]]) -> None: ...
Kluczowe cechy:
Czy interpreter Pythona przetwarza typy z adnotacji w czasie wykonywania?
Nie. Adnotacje są dostępne przez __annotations__, ale nie kontrolują zachowania podczas wykonywania.
Czy można używać zmiennych bez adnotacji w adnotowanych funkcjach?
Tak. Adnotacje nie są obowiązkowe, ale ich brak może wprowadzać w błąd.
Czy można przedefiniować typ zmiennej po adnotacji?
Tak, ale narusza to sens statycznej analizy i przeszkadza linterom. Lepiej tego unikać:
x: int = 5 x = 'ciąg' # Linter będzie zgłaszał błąd, ale kod się wykona.
Negatywny przypadek: Adnotują funkcję, ale w rzeczywistości zwraca typ różny od tego, co w adnotacji, z powodu zmiany logiki funkcji. Zalety:
Pozytywny przypadek: Wszystkie funkcje i dane są adnotowane, projekt jest sprawdzany przez mypy w CI/CD. Zalety: