Python 3.12 / 3.13 值得关注的新特性

2026 年了,还有不少项目卡在 Python 3.8/3.9。本文只讲 3.12 和 3.13 里日常真用得上的东西,按"用了就回不去"的程度排序。

Python 3.12

f-string 彻底解禁(PEP 701)

终于可以在 f-string 里写任何表达式了:嵌套引号、换行、多行 lambda 都行:

songs = {"Bohemian Rhapsody": 1975}
# 3.11 及以前:嵌套同种引号直接 SyntaxError
print(f"Release year: {songs["Bohemian Rhapsody"]}")  # 3.12 OK

# 里面还能再嵌 f-string
print(f"{f"{1 + 1}"}")  # 2

从此 f-string 内外可以用同一种引号,代码格式化工具也不再要把 f-string 拆得面目全非。

类型参数新语法(PEP 695)

泛型写法大幅简化,不用再从 typing 导入 TypeVar:

# old
from typing import TypeVar
T = TypeVar("T")
def first(items: list[T]) -> T: ...

# 3.12: 直接在定义处声明
def first[T](items: list[T]) -> T: ...

# type alias 也有了专属语法
type Vector = list[float]
type Pair[T] = tuple[T, T]

itertools.batched

把可迭代对象按固定大小分批,以前要自己写或用第三方库:

from itertools import batched
for chunk in batched(range(10), 3):
    print(chunk)
# (0, 1, 2) (3, 4, 5) (6, 7, 8) (9,)

处理分页、批量写库、批量调 API 的场景直接受益。

pathlib.Path.walk

目录遍历终于有官方树形走法,替代手动 os.walk 拼路径:

from pathlib import Path
for top, dirs, files in Path(".").walk():
    ...

其他

  • distutils 正式移除,老的 setup.py 依赖它的话必须迁移到 setuptools/pyproject.toml;
  • 自带的 python -m perf(基于 perf 的性能分析器),线上压测定位热点很方便。

Python 3.13

交互式 REPL 重做

python 直接进入的新 REPL 支持多行编辑、彩色输出、F2 查看历史,退出不用再打 exit()(Ctrl+D / 直接 quit 都行)。小改进,体验提升巨大,教新人和临时算东西都舒服很多。

free-threaded 构建(PEP 703,实验性)

无 GIL 的官方构建来了。以 python3.13t 提供,安装时选 free-threaded 版本即可。CPU 密集型多线程不再被 GIL 串行化:

# 用 uv 体验最方便
uv python install 3.13t
uv run --python 3.13t script.py

注意两个现实问题:一是仍是"实验性"(3.14 才转正式支持),二是 C 扩展生态需要逐个适配——NumPy 等大件已支持,长尾小库未必。生产使用再等等,基准测试现在就可以跑。

实验性 JIT(PEP 744)

基于 copy-and-patch 技术的 JIT 编译器,默认关闭,--enable-experimental-jit 编译开启。对常规 Web/脚本负载提升有限,不值得现在折腾,知道有这回事即可。

typing.TypeIs 与 warnings.deprecated

from typing import TypeIs

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

TypeIs 比 TypeGuard 语义更正确(收窄双向生效),自定义类型守卫一律用它。

from warnings import deprecated

@deprecated("Use new_api() instead", category=DeprecationWarning)
def old_api(): ...

废弃 API 从"文档里说一句"升级为"运行时警告 + 静态检查器可见"。

"dead batteries" 清退(PEP 594)

cgi、telnetlib、crypt 等十几个上古模块被移除。老代码里 import cgi 的要处理,现代代码基本不碰这些。

迁移建议

  1. 3.12 是当前甜点版本:生态全兼容,语言特性齐全,性能比 3.10 快约 5%;
  2. 升级前跑一遍 pip-audit + 测试,重点检查 distutils 和 dead batteries 的 import;
  3. 新项目直接 pyproject.toml + requires-python = ">=3.12",别再兼容 3.9;
  4. 3.13 的 REPL 立刻用,free-threaded 关注就好——等你生态里最重的那个 C 扩展官宣支持,再切不迟。

配合 uv 管理多版本 Python,在一台机器上同时装 3.12 / 3.13t 对照测试是零成本的事。

← 返回首页 · 历史归档