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: floatPython 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) # 编译时检查 exhaustivenessfrom 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 及以下 | 已结束安全支持 | ❌ 强烈建议升级 |
Cao Note