类型注解与 Python 新特性
本教程共 70 篇 · 第 69 篇 · 更新于 2026-07-22 · 约 5 分钟阅读
69. 类型注解与 Python 新特性
本节目标:学会给代码加类型注解,了解 Python 3.9/3.10/3.11 的重要新特性,写出更现代、更可维护的代码。
Python 是动态类型语言,变量类型在运行时才确定。这带来了灵活性,也让大型项目的代码难以维护。类型注解(Type Hints)和近期版本的新特性,正在让 Python 在「灵活」与「严谨」之间找到更好的平衡。
类型注解基础
从 Python 3.5 开始,你可以给变量、函数参数和返回值标注类型。这些注解不会影响程序运行,但能让 IDE 提供更好的补全和检查,也能让同事一眼看懂你的意图。
def greet(name: str, age: int) -> str:
return f"{name} 今年 {age} 岁"
message: str = greet("Alice", 30)
name: str表示参数name应该是字符串。-> str表示函数返回值是字符串。message: str给变量标注类型。
如果传错类型,程序不会报错——Python 仍然是动态语言。但静态类型检查工具如 mypy 能在运行前帮你发现错误:
pip install mypy
mypy your_script.py
常用类型
from typing import List, Dict, Tuple, Optional, Union
# 列表,元素都是整数
numbers: List[int] = [1, 2, 3]
# 字典,键是字符串,值是浮点数
scores: Dict[str, float] = {"数学": 95.5, "英语": 88.0}
# 元组,两个元素分别是字符串和整数
person: Tuple[str, int] = ("Alice", 30)
# 可能为 None 的字符串
nickname: Optional[str] = None
# 可以是整数或字符串
data: Union[int, str] = 42
TipPython 3.9+ 可以直接用内置类型写注解,不需要从 typing 导入:
numbers: list[int]、scores: dict[str, float]。这是 3.9 引入的简化语法,推荐新项目使用。
自定义类和 Callable
from typing import Callable
class User:
def __init__(self, name: str) -> None:
self.name = name
def process_user(user: User, formatter: Callable[[str], str]) -> str:
return formatter(user.name)
Callable[[str], str] 表示「接收一个字符串参数、返回字符串」的函数。
Python 3.9 新特性
字典合并运算符
a = {"x": 1, "y": 2}
b = {"y": 3, "z": 4}
# 合并两个字典,后者覆盖前者同名键
print(a | b) # {'x': 1, 'y': 3, 'z': 4}
# 就地更新
a |= b
比之前的 {**a, **b} 更直观,而且支持就地更新。
类型注解简化
3.9 开始,list、dict、set、tuple 等内置类型直接支持泛型,不再需要 typing.List、typing.Dict:
def count_words(words: list[str]) -> dict[str, int]:
...
Python 3.10 新特性
结构模式匹配(match-case)
这是 3.10 最重磅的特性,类似其他语言里的 switch-case,但功能强大得多:
def handle_command(command: str) -> None:
match command.split():
case ['quit']:
print("退出程序")
case ['load', filename]:
print(f"加载文件: {filename}")
case ['save', filename]:
print(f"保存文件: {filename}")
case ['go', direction, distance]:
print(f"向{direction}移动{distance}米")
case _:
print("未知命令")
handle_command("load data.txt")
handle_command("go north 10")
match 不仅能匹配字面量,还能解构列表、字典和对象,是处理复杂分支的利器。
更友好的错误信息
3.10 的报错信息大幅改进,会精确指出语法错误的位置,甚至给出修改建议:
# 旧版报错: SyntaxError: invalid syntax
# 3.10 报错: SyntaxError: did you forget parentheses around the comprehension target?
[x, y for x, y in points]
联合类型的简写
# 3.10 之前
from typing import Union
def process(value: Union[int, str]) -> None: ...
# 3.10 起
def process(value: int | str) -> None: ...
X | Y 替代 Union[X, Y],代码更清爽。
Python 3.11 新特性
显著的性能提升
3.11 是近年来性能提升最大的版本,CPython 平均提速 10%~60%。这得益于更快的帧栈、内联缓存和自适应解释器。你不需要改任何代码,升级就能变快。
更精确的错误追溯
3.11 报错时会用 ^ 精确标出表达式中出错的部分:
# 以前只能定位到整行
# 3.11 能指出是字典里的哪个键出了问题
person = {"name": "Alice", "age": obj.missing_method()}
# ^^^^^^^^^^^^^^^^^^^^^^^^^
# AttributeError: 'NoneType'...
异常组的 try-except*
处理多个并发异常(如 asyncio.gather 里多个任务同时失败):
try:
raise ExceptionGroup("多个错误", [
ValueError("值不对"),
TypeError("类型不对")
])
except* ValueError as eg:
print("捕获到 ValueError:", eg.exceptions)
except* TypeError as eg:
print("捕获到 TypeError:", eg.exceptions)
except* 能分别捕获异常组里的不同类型,而不像普通 except 只能整体捕获。
TOML 解析入库
import tomllib
with open('config.toml', 'rb') as f:
config = tomllib.load(f)
print(config['database']['host'])
TOML 是比 JSON 更友好的配置格式,pyproject.toml 就是基于它。3.11 内置 tomllib,不再依赖第三方库。
小结
- 类型注解让代码自文档化,
mypy能在运行前捕获类型错误。 - Python 3.9 简化了类型注解语法,新增字典合并运算符
|。 - Python 3.10 带来
match-case模式匹配、X | Y联合类型、更友好的报错。 - Python 3.11 大幅提升性能,更精确的错误追溯,
except*和内置tomllib。 - 关注新版本特性,能让你的代码更简洁、更高效、更容易维护。
来源:参考了 runoob「Python 类型注解」、w3cschool「Python3.9/3.10/3.11 更新」、liaoxuefeng「05.5. 数据类型和变量」等,改写后所得。