标签:Python | 类型注解 | typing | 静态检查 | 代码质量字数:约 4000 字建议阅读时间:12 分钟前言Python 3.5 引入的类型注解(Type Hints)如今已成为现代 Python 项目的标配。从 PEP 484 到 PEP 544 再到 Python 3.12 的typing_extensions,类型系统一直在进化。然而,大多数人只知道List[int]、Dict[str, str]这种基础用法,对Protocol、TypeVar、Generic、Literal、Annotated等高级特性知之甚少。本文带你全面掌握 typing 模块的进阶用法,让类型注解真正成为代码的"活的文档"和静态检查的利器。一、基础回顾:常见的类型注解方式from typing import List, Dict, Optional, Union # 变量注解 name: str = "张三" age: int = 25 scores: List[int] = [90, 85, 78] info: Dict[str, Union[str, int]] = {"name": "李四", "age": 30} # 函数注解 def greet(name: str) - str: return f"Hello, {name}" # Optional 是 Union[T, None] 的语法糖 result: Optional[str] = None result: Union[str, None] = None # 等价二、泛型(Generic):类型变量 TypeVar2.1 什么是 TypeVarfrom typing import TypeVar, List T = TypeVar('T') U = TypeVar('U', bound=int) # 有上界的类型变量 # 泛型函数 def first(seq: List[T]) - T: return seq[0] print(first([1, 2, 3])) # int print(first(["a", "b"])) # str print(first([1, "a"])) # Any(推断为 Union[int, str]) # 带约束的 TypeVar def add(a: U, b: U) - U: return a + b add(1, 2) # ✅ int add("a", "b") # ✅ str # add(1, "a") # ❌ TypeError: 类型不匹配2.2 类泛型from typing import TypeVar, Generic T = TypeVar('T') K = TypeVar('K') V = TypeVar('V') class Stack(Generic[T]): def __init__(self): self._items: List[T] = [] def push(self, item: T) - None: self._items.append(item) def pop(self) - T: if not self._items: raise IndexError("Stack is empty") return self._items.pop() def peek(self) - T: return self._items[-1] # 使用时指定类型 stack: Stack[int] = Stack() stack.push(1) st