Python 类型注解
Python3 学习笔记 · 整理自菜鸟教程
一句话
类型注解(type hints)用可读的语法标注变量、参数和返回值的类型,让代码更清晰、IDE 提示更准、静态检查工具能提前发现错误。
要点
- 注解只是提示,运行时 Python 不强制检查类型,写错类型不会自动报错。
- 变量注解:
name: str = "Tom";函数参数与返回值:def f(x: int) -> str:。 - 复杂类型用
typing模块:List、Dict、Tuple、Optional、Union、Callable、Any。 Optional[X]等价于Union[X, None],表示「可能是 X 或 None」。- Python3.9+ 可直接用内置泛型:
list[int]、dict[str, int],无需导入typing。 - Python3.10+ 用
X | Y表示联合类型,X | None替代Optional[X]。 from __future__ import annotations可让注解延迟求值,避免前向引用问题。- 用
mypy、pyright等工具做静态检查,把注解变成真正的保障。
语法 / 常用方法
| 语法/方法 | 说明 | 示例 |
|---|---|---|
x: int = 1 |
变量注解 | count: int = 0 |
def f(a: int) -> str: |
参数与返回值注解 | 返回字符串 |
def f() -> None: |
无返回值 | 只做副作用 |
List[int] |
整数列表 | from typing import List |
Dict[str, int] |
键值类型 | {"a": 1} |
Tuple[int, str] |
定长元组 | (1, "x") |
Set[str] |
字符串集合 | {"a"} |
Optional[int] |
int 或 None | Union[int, None] |
Union[int, str] |
二选一 | `int |
Callable[[int], str] |
可调用对象 | 函数类型 |
Any |
任意类型,跳过检查 | from typing import Any |
Sequence / Iterable |
抽象容器/可迭代 | 接收更宽泛类型 |
list[int] |
内置泛型(3.9+) | 不用 import |
| `X | None` | 联合类型(3.10+) |
代码示例
1 | |
易错点
- 注解不强制:
def f(x: int): return x + 1传字符串照样运行,要靠 mypy 等工具检查。 - 默认值
None但要接收 None:参数默认None时类型应写Optional[X],否则静态检查会警告。 - 可变类型别省略:
List[int]不能写List(部分检查器允许但失去精度)。 - 运行时访问注解:
f.__annotations__存的是对象,用字符串前向引用要用from __future__ import annotations或引号包裹。 Union[int, str]不等于int | str永远可换:旧版本 Python 不支持|语法,注意目标版本。Any是逃生舱:过度使用会让类型检查形同虚设,能用具体类型就别用Any。