Python 范型Typing速查
已于 2026年02月03日 09:54 修改
访问次数:0
下面我把你给出的内容 整合 + 精简 + 结构化 成一份完整、连贯的 typing 模块功能介绍,适合直接作为笔记或文档使用 👇
Python typing 模块功能简要介绍
typing 模块用于为 Python 提供类型注解(Type Hints),帮助静态类型检查工具(如 mypy、pyright)提升代码的安全性、可读性和可维护性,尤其在大型项目中非常重要。
一、基础与通用类型
1️⃣ Any
Any 表示任意类型,使用它会关闭类型检查。
from typing import Any
def process(value: Any) -> Any:
return value
⚠️ 警告:应尽量避免大量使用 Any,否则会失去类型检查的意义。
2️⃣ Union
Union 表示多个类型中的一种。
from typing import Union
def process(value: Union[int, str]) -> str:
return str(value)
3️⃣ Optional
Optional[X] 等价于 Union[X, None],用于表示可能为 None 的值。
from typing import Optional
def greet(name: Optional[str]) -> str:
return "Hello, guest!" if name is None else f"Hello, {name}!"
二、容器类型
from typing import List, Tuple, Set, Dict
- List[T]:同类型列表
- Tuple[T1, T2]:固定长度、可不同类型
- Set[T]:同类型集合
- Dict[K, V]:键值对字典
def process_numbers(nums: List[int]) -> int:
return sum(nums)
三、迭代相关类型
from typing import Iterable, Iterator, Generator
- Iterable[T]:可迭代对象
- Iterator[T]:迭代器(有 __next__)
- Generator[Y, S, R]:生成器(yield 类型)
def get_numbers() -> Generator[int, None, None]:
yield 1
yield 2
四、函数与类相关类型
4️⃣ Callable
描述可调用对象(函数、方法)。
from typing import Callable
def apply_fn(fn: Callable[[int, int], int], a: int, b: int) -> int:
return fn(a, b)
5️⃣ Type
用于表示某个类本身的类型。
from typing import Type
def create_instance(cls: Type[int]) -> int:
return cls(42)
五、泛型相关(重点)
6️⃣ TypeVar
用于定义类型变量,实现泛型函数或类。
from typing import TypeVar, List
T = TypeVar('T')
def first_element(lst: List[T]) -> T:
return lst[0]
7️⃣ Generic
用于定义泛型类,通常和 TypeVar 搭配使用。
from typing import Generic, TypeVar
T = TypeVar('T')
class Box(Generic[T]):
def __init__(self, value: T):
self.value = value
def get(self) -> T:
return self.value
8️⃣ ClassVar
用于标注类属性(非实例属性)。
from typing import ClassVar
class MyClass:
category: ClassVar[str] = "demo"
value: int
六、常量与值约束
9️⃣ Literal
限制变量只能取指定常量值。
from typing import Literal
def move(direction: Literal["up", "down", "left", "right"]) -> str:
return f"Moving {direction}"
🔟 Final
表示变量或属性不应被重新赋值或继承。
from typing import Final
PI: Final = 3.14159
七、结构化与特殊用途
1️⃣1️⃣ TypedDict
为字典定义固定结构。
from typing import TypedDict
class User(TypedDict):
name: str
age: int
1️⃣2️⃣ NoReturn
表示函数不会正常返回(通常直接抛异常)。
from typing import NoReturn
def raise_error() -> NoReturn:
raise RuntimeError("error")
八、定义类型:NewType
可以使用NewType定义一个新的类型, 如下实现了不混用user_id和task_id(虽然都是int):
from dataclasses import dataclass
from typing import NewType
TaskId = NewType("TaskId", int)
UserId = NewType("UserId", int)
@dataclass(frozen=True, slots=True)
class Task:
task_id: TaskId
user_id: UserId🧠 现在类型系统能做到什么?
task = Task(task_id=TaskId(1), user_id=UserId(2))
❌ 下面这行 IDE 会直接报错:
Task(task_id=UserId(1), user_id=TaskId(2))
🧩 为什么 NewType 是对的,而 TypeVar 不行?
| 工具 | 作用 |
|---|---|
| TypeVar | 泛型占位符(行为流动) |
| NewType | 语义标签(领域概念) |
一句话记忆:
TypeVar 是“将来再说” NewType 是“现在就区分”
九、Python 3.10+ 新语法
1️⃣3️⃣ UnionType(| 运算符)
def process(value: int | str) -> str:
return str(value)
等价于:
Union[int, str]
总结速览
typing 模块核心能力:
- 🧱 基础类型:Any, Union, Optional
- 📦 容器类型:List, Tuple, Set, Dict
- 🔁 迭代类型:Iterable, Iterator, Generator
- 🧠 泛型支持:TypeVar, Generic, ClassVar
- 🔒 约束能力:Literal, Final
- 🧾 结构定义:TypedDict
- 🚫 特殊语义:NoReturn
- ✨ 新语法:X | Y
这些工具让 Python 在保持灵活性的同时,具备接近静态语言的类型安全能力,在中大型项目中尤为重要。
评论(0)