Skip to content

Python 新特性(3.10 ~ 3.13) ​

记录 Python 近几个版本的重要语言特性和改进,帮助项目升级和编写现代 Python 代码。

Python 3.10 ​

结构模式匹配(match-case) ​

python
# 基本匹配
def process(value):
    match value:
        case 1:
            return "one"
        case 2:
            return "two"
        case _:
            return "other"

# 匹配字面量 + 变量绑定
def describe_point(point):
    match point:
        case (0, 0):
            return "原点"
        case (0, y):
            return f"Y 轴上的点, y={y}"
        case (x, 0):
            return f"X 轴上的点, x={x}"
        case (x, y):
            return f"普通点, x={x}, y={y}"
        case _:
            return "不是二维坐标"

# 匹配类
from dataclasses import dataclass

@dataclass
class Command:
    name: str
    args: list

def execute(cmd):
    match cmd:
        case Command(name="quit"):
            return "退出"
        case Command(name="greet", args=[name]):
            return f"你好, {name}"
        case _:
            return f"未知命令: {cmd}"

# 带保护条件的匹配
def classify(value):
    match value:
        case x if x < 0:
            return "负数"
        case 0:
            return "零"
        case x if x > 0:
            return "正数"
# 基本匹配
def process(value):
    match value:
        case 1:
            return "one"
        case 2:
            return "two"
        case _:
            return "other"

# 匹配字面量 + 变量绑定
def describe_point(point):
    match point:
        case (0, 0):
            return "原点"
        case (0, y):
            return f"Y 轴上的点, y={y}"
        case (x, 0):
            return f"X 轴上的点, x={x}"
        case (x, y):
            return f"普通点, x={x}, y={y}"
        case _:
            return "不是二维坐标"

# 匹配类
from dataclasses import dataclass

@dataclass
class Command:
    name: str
    args: list

def execute(cmd):
    match cmd:
        case Command(name="quit"):
            return "退出"
        case Command(name="greet", args=[name]):
            return f"你好, {name}"
        case _:
            return f"未知命令: {cmd}"

# 带保护条件的匹配
def classify(value):
    match value:
        case x if x < 0:
            return "负数"
        case 0:
            return "零"
        case x if x > 0:
            return "正数"

联合类型(Union Type Syntax) ​

python
# Python 3.10 之前
from typing import Union
def greet(name: Union[str, None]) -> str: ...

# Python 3.10 之后
def greet(name: str | None) -> str: ...

# 支持任意组合
def process(id: int | str, config: dict | None = None) -> int | str: ...

# isinstance / issubclass 也支持
isinstance(42, int | str)  # True
# Python 3.10 之前
from typing import Union
def greet(name: Union[str, None]) -> str: ...

# Python 3.10 之后
def greet(name: str | None) -> str: ...

# 支持任意组合
def process(id: int | str, config: dict | None = None) -> int | str: ...

# isinstance / issubclass 也支持
isinstance(42, int | str)  # True

其他改进 ​

python
# 更清晰的错误信息
# 3.10+ 在语法错误中会给出更精确的提示

# zip 支持 strict 模式
items = [1, 2, 3]
labels = ["a", "b"]
list(zip(items, labels, strict=True))  # 长度不匹配时抛出 ValueError

# dataclass 支持 slots
from dataclasses import dataclass

@dataclass(slots=True)
class Point:
    x: float
    y: float
# 更清晰的错误信息
# 3.10+ 在语法错误中会给出更精确的提示

# zip 支持 strict 模式
items = [1, 2, 3]
labels = ["a", "b"]
list(zip(items, labels, strict=True))  # 长度不匹配时抛出 ValueError

# dataclass 支持 slots
from dataclasses import dataclass

@dataclass(slots=True)
class Point:
    x: float
    y: float

Python 3.11 ​

异常组(ExceptionGroup) ​

python
# 同时抛出多个异常
def validate(data):
    errors = []
    if "name" not in data:
        errors.append(ValueError("missing name"))
    if "age" not in data:
        errors.append(ValueError("missing age"))
    if errors:
        raise ExceptionGroup("validation failed", errors)

# 捕获特定类型的异常
try:
    validate({"name": "Alice"})
except* ValueError as e:
    print(f"ValueError: {e.exceptions}")
except* TypeError as e:
    print(f"TypeError: {e.exceptions}")
# 同时抛出多个异常
def validate(data):
    errors = []
    if "name" not in data:
        errors.append(ValueError("missing name"))
    if "age" not in data:
        errors.append(ValueError("missing age"))
    if errors:
        raise ExceptionGroup("validation failed", errors)

# 捕获特定类型的异常
try:
    validate({"name": "Alice"})
except* ValueError as e:
    print(f"ValueError: {e.exceptions}")
except* TypeError as e:
    print(f"TypeError: {e.exceptions}")

类型注解改进 ​

python
from typing import Self, LiteralString, Never, assert_never

# Self:返回自身类型
class MyClass:
    @classmethod
    def create(cls) -> Self:
        return cls()

    def copy(self) -> Self:
        return self.__class__()

# LiteralString:必须是字符串字面量
def execute_query(sql: LiteralString): ...

# Never:永不返回的类型
def assert_never(x: Never) -> Never:
    raise AssertionError(f"Unexpected value: {x}")

def process(value: int | str) -> None:
    match value:
        case int():
            print(f"int: {value}")
        case str():
            print(f"str: {value}")
        case _:
            assert_never(value)  # 编译时检查 exhaustiveness
from typing import Self, LiteralString, Never, assert_never

# Self:返回自身类型
class MyClass:
    @classmethod
    def create(cls) -> Self:
        return cls()

    def copy(self) -> Self:
        return self.__class__()

# LiteralString:必须是字符串字面量
def execute_query(sql: LiteralString): ...

# Never:永不返回的类型
def assert_never(x: Never) -> Never:
    raise AssertionError(f"Unexpected value: {x}")

def process(value: int | str) -> None:
    match value:
        case int():
            print(f"int: {value}")
        case str():
            print(f"str: {value}")
        case _:
            assert_never(value)  # 编译时检查 exhaustiveness

性能提升 ​

bash
# 3.11 是 Python 历史上性能提升最大的版本
# - 函数调用开销降低 10-60%
# - 启动时间加快 10-15%
# - 整体性能提升约 22%(CPython 基准测试)
# 3.11 是 Python 历史上性能提升最大的版本
# - 函数调用开销降低 10-60%
# - 启动时间加快 10-15%
# - 整体性能提升约 22%(CPython 基准测试)

其他改进 ​

python
# 异常备注
try:
    1 / 0
except Exception as e:
    e.add_note("除数不能为零")
    raise

# 正则表达式支持原子分组
import re
# (?>...) 原子分组,防止回溯
pattern = re.compile(r"(?>a+)ab")
# 异常备注
try:
    1 / 0
except Exception as e:
    e.add_note("除数不能为零")
    raise

# 正则表达式支持原子分组
import re
# (?>...) 原子分组,防止回溯
pattern = re.compile(r"(?>a+)ab")

Python 3.12 ​

f-string 改进 ​

python
# 3.12 之前:f-string 不能包含引号相同的表达式
# 3.12 之后:支持重复使用相同引号

# 3.12+
s = f"{dict(**{'key': 'value'})}"

# 多行 f-string
name = "Alice"
s = f"{
    name.upper()
} 你好"  # "ALICE 你好"

# 支持反斜杠
s = f"{\"hello\"}"  # 之前会报错
# 3.12 之前:f-string 不能包含引号相同的表达式
# 3.12 之后:支持重复使用相同引号

# 3.12+
s = f"{dict(**{'key': 'value'})}"

# 多行 f-string
name = "Alice"
s = f"{
    name.upper()
} 你好"  # "ALICE 你好"

# 支持反斜杠
s = f"{\"hello\"}"  # 之前会报错

type 语句 ​

python
# 3.12 引入 type 别名语句
type Point = tuple[float, float]
type Vector = list[Point]

# 带泛型的类型别名
type ListOrValue[T] = list[T] | T

def process(items: ListOrValue[int]) -> int:
    match items:
        case [*items]:
            return sum(items)
        case x:
            return x
# 3.12 引入 type 别名语句
type Point = tuple[float, float]
type Vector = list[Point]

# 带泛型的类型别名
type ListOrValue[T] = list[T] | T

def process(items: ListOrValue[int]) -> int:
    match items:
        case [*items]:
            return sum(items)
        case x:
            return x

更强大的类型参数(PEP 695) ​

python
# 3.12 之前
from typing import TypeVar, Generic
T = TypeVar("T")

class Stack(Generic[T]):
    def push(self, item: T) -> None: ...
    def pop(self) -> T: ...

# 3.12 之后(更简洁的语法)
class Stack[T]:
    def push(self, item: T) -> None: ...
    def pop(self) -> T: ...

# 泛型函数
def first[T](items: list[T]) -> T:
    return items[0]

# 带约束的泛型
class Number[T: int | float]:
    def __init__(self, value: T):
        self.value = value
# 3.12 之前
from typing import TypeVar, Generic
T = TypeVar("T")

class Stack(Generic[T]):
    def push(self, item: T) -> None: ...
    def pop(self) -> T: ...

# 3.12 之后(更简洁的语法)
class Stack[T]:
    def push(self, item: T) -> None: ...
    def pop(self) -> T: ...

# 泛型函数
def first[T](items: list[T]) -> T:
    return items[0]

# 带约束的泛型
class Number[T: int | float]:
    def __init__(self, value: T):
        self.value = value

性能改进 ​

bash
# - 模块加载速度提升约 20-30%
# - asyncio 性能提升
# - 内联 Python 函数调用的优化
# - 模块加载速度提升约 20-30%
# - asyncio 性能提升
# - 内联 Python 函数调用的优化

Python 3.13 ​

自由线程(Free-Threaded CPython) ​

bash
# 3.13 引入了禁用 GIL 的选项(实验性)
# 安装: python3.13t 或 PYTHON_GIL=0
# 运行: PYTHON_GIL=0 python app.py
# 3.13 引入了禁用 GIL 的选项(实验性)
# 安装: python3.13t 或 PYTHON_GIL=0
# 运行: PYTHON_GIL=0 python app.py

交互式解释器改进 ​

python
# 3.13 改进了 REPL,支持多行编辑、颜色高亮
# 运行: python 即可进入新的交互式环境
# 3.13 改进了 REPL,支持多行编辑、颜色高亮
# 运行: python 即可进入新的交互式环境

类型注解改进 ​

python
# TypeIs(PEP 742)— 更好的类型窄化
from typing import TypeIs

def is_str_list(value: list[object]) -> TypeIs[list[str]]:
    return all(isinstance(x, str) for x in value)

def process(items: list[object]):
    if is_str_list(items):
        # 在此分支中 items 被窄化为 list[str]
        print(" ".join(items))
# TypeIs(PEP 742)— 更好的类型窄化
from typing import TypeIs

def is_str_list(value: list[object]) -> TypeIs[list[str]]:
    return all(isinstance(x, str) for x in value)

def process(items: list[object]):
    if is_str_list(items):
        # 在此分支中 items 被窄化为 list[str]
        print(" ".join(items))

其他改进 ​

python
# random 模块支持可插拔的随机数生成器
import random
rng = random.Random(42)

# @deprecated 装饰器(warnings.deprecated)
import warnings

@warnings.deprecated("请使用 new_function()")
def old_function():
    pass
# random 模块支持可插拔的随机数生成器
import random
rng = random.Random(42)

# @deprecated 装饰器(warnings.deprecated)
import warnings

@warnings.deprecated("请使用 new_function()")
def old_function():
    pass

版本选择建议 ​

版本状态建议
3.13最新(2025 发布)新项目可选用,read-threaded CPython 实验性
3.12稳定当前最推荐的生产版本
3.11稳定成熟版本,性能提升大
3.10安全支持中建议升级到 3.11+
3.9 及以下已结束安全支持❌ 强烈建议升级