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 的要处理,现代代码基本不碰这些。
迁移建议
- 3.12 是当前甜点版本:生态全兼容,语言特性齐全,性能比 3.10 快约 5%;
- 升级前跑一遍
pip-audit+ 测试,重点检查distutils和 dead batteries 的 import; - 新项目直接
pyproject.toml+requires-python = ">=3.12",别再兼容 3.9; - 3.13 的 REPL 立刻用,free-threaded 关注就好——等你生态里最重的那个 C 扩展官宣支持,再切不迟。
配合 uv 管理多版本 Python,在一台机器上同时装 3.12 / 3.13t 对照测试是零成本的事。