首页 / Python3 入门教程 / 类型注解与 Python 新特性

Python3 入门教程

类型注解与 Python 新特性

本教程共 70 篇 · 第 69 篇 · 更新于 2026-07-22 · 约 5 分钟阅读

PythonPython3 入门教程类型注解match-case新特性

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
Tip

Python 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 开始,listdictsettuple 等内置类型直接支持泛型,不再需要 typing.Listtyping.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. 数据类型和变量」等,改写后所得。