Generic types allow creating reusable type-safe classes and functions.
1from typing import TypeVar, Generic, Sequence23T = TypeVar("T")45class Stack(Generic[T]):6 def __init__(self) -> None:7 self._items: list[T] = []89 def push(self, item: T) -> None:10 self._items.append(item)1112 def pop(self) -> T:13 return self._items.pop()1415 def peek(self) -> T:16 return self._items[-1]1718# Typed stack19int_stack: Stack[int] = Stack()20int_stack.push(42)21value: int = int_stack.pop() # Type-safe2223str_stack: Stack[str] = Stack()24str_stack.push("hello")
Multiple type variables:
1K = TypeVar("K")2V = TypeVar("V")34class Registry(Generic[K, V]):5 def __init__(self) -> None:6 self._data: dict[K, V] = {}78 def set(self, key: K, value: V) -> None:9 self._data[key] = value1011 def get(self, key: K) -> V | None:12 return self._data.get(key)
Benefits: