转载声明:本文翻译转载自 mathspp.com 的文章 4 upgrades to the Python standard library in 3.15,作者 Rodrigo Girão Serrão,原文发布于 2026 年 10 月 28 日。本文为翻译转载,版权归原作者所有。
本文重点介绍 Python 3.15 中标准库最令人兴奋的 4 项更新:
json.load新增object_hook:与frozendict搭配可以解锁一个非常强大的用例- 新模块
math.integer:引入整数算术函数的新模块 - 新函数
re.prefixmatch:厘清使用re.match时常见的困惑 - 新方法
asyncio.TaskGroup.cancel:以符合人体工学的方式取消任务组中的所有任务
「Python 3.15 的 15 天」系列
为了庆祝 Python 3.15 发布,作者将在接下来的 15 个工作日里,每天讲解一个 Python 3.15 的新特性——解释清晰、附带示例,让你不必自己去翻变更日志。
json.load 新增 object_hook
json.load 函数现在有了参数 object_hook,可以把它设为一个可调用对象。设置之后,被解码成字典的 JSON 对象会先传给 object_hook,再用它的返回值替换。
例如,假设文件 data.json 里有如下 JSON 数据:
1 | { |
定义一个 object hook 并在加载数据时使用它:
1 | import json |
运行这段代码会输出两行:
1 | Inside object_hook with d = {'first': 'Rodrigo', 'last': 'Girão Serrão'}. |
与 object_hook 类似,json.load 还有一个参数 array_hook,它在 JSON 数组被处理成列表时被调用。两者结合,再利用新的 frozendict 类型,你就可以把 JSON 数据加载成不可变结构:
1 | import json |
1 | frozendict({ |
新模块 math.integer
新模块 math.integer 提供了一批接受整数参数、返回整数结果的数学函数。截至 3.15,该模块定义了六个函数:
| 函数 | 行为 |
|---|---|
comb(n, k) |
计算 n 个对象中取 k 个的组合数 |
perm(n, k=None) |
计算 n 个对象中取 k 个的排列数 |
gcd(*integers) |
计算所有参数的最大公约数 |
lcm(*integers) |
计算所有参数的最小公倍数 |
isqrt(n) |
计算参数的整数平方根 |
factorial(n) |
计算参数的阶乘 |
新函数 re.prefixmatch
下面这段代码的输出是什么?
1 | import re |
如果你以为结果是 "Number 12000 found in the string!",那你不是一个人!但你答错了。
函数 re.match 只匹配字符串的开头,这一点从 re.match 这个名字完全看不出来。更糟的是,其他编程语言用 match 这个名字在字符串的任意位置查找匹配——而那在 Python 里是 re.search 干的事。
为了缓解这种混淆,3.15 引入了函数 re.prefixmatch。它做的事与 re.match 完全一样,但名字更清晰。re.match 存在的时间太久了,不会被移除,但它已被软弃用(soft deprecated)。这意味着新代码应当使用 re.prefixmatch,而 re.match 会为了向后兼容而保留。
新方法 asyncio.TaskGroup.cancel
任务组(task group)在 Python 3.11 中引入,为管理多个异步任务提供了便利。令人意外的是,此前并没有一种符合人体工学的方式来取消任务组中的所有任务。新方法 TaskGroup.cancel 修复了这一点。
假设你在管理一台实验室仪器,需要用任务来读取测量值、监控仪器状态、保持连接存活。用完仪器后,你想取消所有任务。在 TaskGroup.cancel 出现之前,你大概会这样写:
1 | import asyncio, contextlib |
注意,最顺手的写法甚至根本没用任务组。如果你用了任务组,代码反而会变得更繁琐:
1 | import asyncio, contextlib |
随着 TaskGroup.cancel 的引入,你不再需要逐个记录任务,代码得以简化:
1 | import asyncio, contextlib |
标准库的其他精彩新增
Python 3.15 还为标准库带来了其他重要新增,作者已为它们写了单独的文章:
- 新内置
frozendict - 新内置
sentinel - 新模块
profiling与新的采样分析器 Tachyon(profiling.sampling) typing的改进(更好的TypedDict、新的TypeForm、新的@disjoint_base等)
Python 3.15 的精彩远不止于此
从两个新内置的 frozendict 和 sentinel,到惰性导入(lazy imports)、包启动配置文件、typing 改进,以及更多色彩支持,Python 3.15 还有很多值得一看的东西。如果你想进一步了解 Python 3.15 的新特性,可以看看作者正在连载的「Python 3.15 的 15 天」系列——15 天里每天讲解一个 Python 3.15 新特性。
参考资料
- math.integer — integer-specific mathematics functions — Python 3.15 documentation,https://docs.python.org/3.15/library/math.integer.html
- re – Regular expression operations — Python 3.15 documentation,https://docs.python.org/3.15/library/re.html#re.prefixmatch
- Coroutines and tasks — Python 3.15 documentation,https://docs.python.org/3/library/asyncio-task.html#task-groups
- Add an asyncio.TaskGroup.cancel method — Issue #108951 python/cpython,https://github.com/python/cpython/issues/108951
- json — Python 3.15 documentation,https://docs.python.org/3/library/json.html#json.load