Python typing 模块全面指南与类型注解详解

前言

Python 的 typing 模块是现代 Python 开发(尤其是大型项目)中不可或缺的神器。它能极大地提高代码的可读性,并配合 IDE(如 VS Code、PyCharm)和静态类型检查工具(如 mypy)进行类型检查,减少运行时 Bug。

以下内容整理了所有类型注解补全,并额外补充了其他高频常用类型,分为四大类进行详细说明,帮助你一次性全面掌握。

导入部分(已补全常用类型)

from typing import (

TYPE_CHECKING,

Literal,

Optional,

Callable,

Generator,

Dict,

List, # 补充:列表

Tuple, # 补充:元组

Set, # 补充:集合

Any,

Awaitable,

Union,

Iterable, # 补充:可迭代对象

Iterator, # 补充:迭代器

Sequence, # 补充:序列(更宽泛的列表/元组/字符串)

TypeVar, # 补充:泛型变量

Protocol, # 补充:协议(结构化类型/鸭子类型)

TypedDict, # 补充:类型化字典(固定键)

Final, # 补充:最终变量(不可重新赋值)

Annotated, # 补充:带元数据的类型(Python 3.9+)

cast, # 补充:类型转换工具(运行时不检查)

overload, # 补充:函数重载

)

注意:Python 3.9+ 后,内置容器(如 list, dict, tuple, set)可以直接小写使用,无需从 typing 导入。但为了兼容旧版本和统一风格,很多项目仍从 typing 导入。

第一类:基础容器与数据结构 (Basic Containers)

1. Dict[K, V]、List[T]、Tuple[... ]、Set[T]

用法:泛型容器,指定内部元素的类型。

场景:明确数据结构的内容,提高可读性和检查严谨性。

from typing import Dict, List, Tuple, Set

user_info: Dict[str, int] = {"age": 18, "id": 1001}

scores: List[float] = [98.5, 88.0, 100.0]

point: Tuple[int, int, int] = (10, 20, 30) # 定长定类型

flexible_tuple: Tuple[int, ...] = (1, 2, 3, 4) # 变长同类型(Python 3.11+ 更优雅)

unique_ids: Set[str] = {"id1", "id2"}

2. Any

用法:表示任意类型,类型检查器对此变量完全放行。

注意:慎用!相当于关闭类型检查,失去 typing 的意义。

from typing import Any

def print_anything(data: Any) -> None:

print(data) # 可以传任何类型

3. Sequence[T](补充)

含义:比 List 更宽泛,包括 list、tuple、str、bytes 等所有支持索引、len()、切片的序列。

优势:函数参数更通用,兼容性更好。

from typing import Sequence

def print_reverse(seq: Sequence[int]) -> None:

print(seq[::-1]) # 接受 list、tuple、range 等

第二类:逻辑控制与组合 (Logic & Composition)

4. Union[A, B, ...]

含义:联合类型,“A 或 B 或 …”。

新语法(Python 3.10+):直接用 A | B。

from typing import Union

def get_user(user_id: Union[int, str]) -> None: ...

# 等价于 Python 3.10+

# def get_user(user_id: int | str) -> None: ...

5. Optional[T]

含义:等价于 T | None,表示可以为 None。

常见场景:函数参数默认值为 None。

from typing import Optional

def greet(name: Optional[str] = None) -> None:

print(f"Hello, {name or 'Guest'}")

6. Literal['a', 'b', 42]

含义:字面量类型,变量值必须是指定的常量之一。

场景:模式选择、状态码、配置开关,非常适合代替枚举的轻量场景。

from typing import Literal

FileMode = Literal['r', 'w', 'a', 'rb']

def open_file(mode: FileMode) -> None: ...

第三类:函数、生成器与异步 (Functions & Async)

7. Callable[[Arg1, Arg2, ...], ReturnType]

含义:表示一个可调用对象(函数、lambda、类实例带 call)。

用法:常用于回调函数参数。

from typing import Callable

def calculate(a: int, b: int, op: Callable[[int, int], int]) -> int:

return op(a, b)

calculate(3, 4, lambda x, y: x * y)

8. Generator[YieldType, SendType, ReturnType]

含义:标注 yield 生成器的三种类型。

YieldType:yield 出的值类型(最常用)。

SendType:通过 .send() 传入的值类型(常用 None)。

ReturnType:生成器结束时的返回值(通常 None)。

from typing import Generator

def count_down(n: int) -> Generator[int, None, None]:

while n > 0:

yield n

n -= 1

9. Iterable[T] 与 Iterator[T](补充)

Iterable:可被 for 循环遍历的对象。

Iterator:支持 next() 的对象(通常是 Iterable 的迭代器)。

建议:参数只需遍历时用 Iterable 更宽松。

from typing import Iterable

def process_items(items: Iterable[str]) -> None:

for item in items:

print(item)

10. Awaitable[T]

含义:可以被 await 的对象(通常是协程)。

场景:高级异步框架中传递任务。

from typing import Awaitable

async def run_task(task: Awaitable[int]) -> None:

result = await task

print(result)

第四类:特殊工具与高级用法 (Special Tools)

11. TYPE_CHECKING

含义:运行时为 False,类型检查时为 True。

核心用途:解决循环导入问题,只在静态检查时导入类。

from typing import TYPE_CHECKING

if TYPE_CHECKING:

from .models import User # 只在 mypy 检查时导入

def process_user(user: "User") -> None: ... # 字符串引用避免运行时导入

12. TypeVar、Generic(补充泛型)

用途:实现类型一致的泛型函数/类。

from typing import TypeVar, List

T = TypeVar('T')

def first_item(items: List[T]) -> T:

return items[0]

# 调用时自动推断:first_item([1, 2]) -> int

13. Final[T](补充)

含义:标记变量/属性不可重新赋值(类型检查器会报错)。

from typing import Final

API_KEY: Final[str] = "abc123"

# API_KEY = "new" # mypy 会报错

14. Annotated[T, ...](补充,Python 3.9+)

含义:为类型附加元数据,常用于第三方库(如 pydantic、fastapi)的验证。

from typing import Annotated

PositiveInt = Annotated[int, lambda x: x > 0]

def set_age(age: PositiveInt) -> None: ...

15. TypedDict(补充)

含义:为字典指定固定键和对应类型(结构化 dict)。

from typing import TypedDict

class Movie(TypedDict):

title: str

year: int

movie: Movie = {"title": "Inception", "year": 2010}

总结速查表 (Cheatsheet)

类型注解

简单解释

典型场景

Dict[K, V]

字典,指定键值类型

配置、JSON 数据

List[T]

列表

集合数据

Tuple[A, B, ...]

定长元组

坐标、固定字段

Set[T]

集合

去重 ID

Sequence[T]

通用序列(list/tuple/str 等)

参数只需索引访问

Any

任意类型(慎用)

动态数据、第三方库回调

Union[A, B] 或 A | B

多选一

ID 可为 int 或 str

Optional[T]

T 或 None

可选参数、可能缺失字段

Literal['a', 42]

固定字面值

模式、状态码

Callable[[...], R]

函数/回调

高阶函数、策略模式

Generator[Y, S, R]

生成器

yield 迭代器

Iterable[T]

可遍历对象

for 循环参数

Awaitable[T]

可 await 的协程

异步任务调度

TYPE_CHECKING

类型检查开关

解决循环导入

TypeVar('T')

泛型占位符

通用函数/类

Final[T]

不可变常量

配置常量、魔法值

Annotated[T, ...]

带元数据类型

验证、依赖注入

TypedDict

固定键类型的字典

API 返回结构、配置