page contents

python-3.15新特性:推导式解包与 frozendict,让代码更短、更安全

Python 3.15 已经在 2026 年 10 月正式发布,这一版新特性不少,真正会在日常代码里高频出现的,有两个很“顺手”的变化:推导式中的解包和冻结字典 frozendict。

attachments-2026-11-bNvGwjF96af11eca3f992.png

Python 3.15 已经在 2026 年 10 月正式发布,这一版新特性不少,真正会在日常代码里高频出现的,有两个很“顺手”的变化:推导式中的解包和冻结字典 frozendict。

它们一个让合并、展平数据更直观,一个让不可变配置、缓存键、权限映射等场景更安全。对 Python 开发者来说,这两个特性都不算“颠覆式”,但确实属于那种一旦用上,就很难回得去的改进。

推导式解包:把“嵌套循环”写成“直接摊开”

PEP 798 让列表、集合、字典推导式以及生成器表达式支持 * 和 ** 解包。

以前展平嵌套列表,很多人会写:

lists = [[1, 2], [3, 4], [5]]
flat = [x for sub in lists for x in sub]

功能没问题,但两个 for 的顺序确实容易让人卡一下。 Python 3.15 之后可以这样写:

flat = [*sub for sub in lists]
# [1, 2, 3, 4, 5]

读起来更接近自然语言:把每个 sub 解包进来。 字典合并也更直观了:

dicts = [{"a": 1}, {"b": 2}, {"a": 3}]
merged = {**d for d in dicts}
# {'a': 3, 'b': 2}

集合也可以:

sets = [{1, 2}, {3, 4}, {2, 3}]
all_items = {*s for s in sets}
# {1, 2, 3, 4}

生成器表达式同样支持:

gen = (*t for t in [(1, 2), (3, 4)])
list(gen)  # [1, 2, 3, 4]

这个语法最大的价值不是“少写几行”,而是减少阅读负担。旧写法需要理解嵌套 for 的顺序,新写法更像在表达意图:把一组数据拆开、合并、摊平。

不过它仍然是语法糖。如果推导式里同时塞进条件判断、函数调用、多层嵌套,代码反而会变难读。比较稳妥的边界是:一眼能看懂就用,超过一行还绕脑子,就拆回普通循环。

frozendict:字典终于有了“冻结版”

PEP 814 给 Python 带来了内置类型 frozendict。

它和普通 dict 最大的区别是:创建之后不能修改。

config = frozendict(debug=True, workers=4)
config["debug"] = False
# TypeError: 'frozendict' object does not support item assignment

这看起来只是“不能改”,但实际影响很大。 普通字典是可变的,所以它不可哈希,不能直接作为字典的键,也不能放进集合,更不能直接用作 functools.cache 的缓存参数。

frozendict 在所有键和值都可哈希时,自身也可哈希。

比如可以这样用:

permissions = {
    frozendict(role="admin"): {"read", "write", "delete"},
    frozendict(role="viewer"): {"read"},
}

也可以用于缓存:

from functools import cache

@cache
def get_data(params: frozendict) -> str:
    ...

这对配置对象、权限表、规则映射、API 参数缓存等场景非常友好。以前要么用 types.MappingProxyType,要么引入第三方 frozendict 库;现在它直接进入内置类型,使用成本更低。

需要注意几个细节:

frozendict 不是 dict 的子类,而是直接继承 object。

isinstance(x, dict) 不会匹配 frozendict。

更推荐用 collections.abc.Mapping 做类型判断。

它保留插入顺序,但相等比较不考虑顺序。

嵌套结构中,只有外层不可变;如果值本身是可变对象,内部仍然可能被修改。

这两个特性适合什么时候用?

推导式解包适合处理数据合并、展平、去重,尤其是从多个列表、字典、集合中拼装结果时。它的优势是直观,但前提是不要写得太“炫”。

frozendict 更适合需要不可变、可哈希、可共享的映射场景,比如常量配置、缓存键、权限映射、规则表、函数默认参数保护等。它不是要替代所有 dict,而是补上了 Python 长期缺少的一块能力。

小提醒

Python 3.15 已经发布稳定版,如果你在使用 3.12、3.13 或 3.14,建议先慎重考虑之后再决定,如果确定打算升级,先在测试环境或 CI 中验证依赖兼容性。尤其是 frozendict 和推导式解包都属于新语法/新类型,旧版本解释器无法运行。如果项目需要兼容多版本,最好通过版本判断或封装层来过渡。

总体来看,这两个特性都不复杂,却能让日常 Python 代码更干净:推导式解包让合并数据更顺,frozendict 让不可变数据更安全。 它们不是炫技型更新,而是真正会慢慢渗透进生产代码里的改进。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

 

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2564 篇文章

作家榜 »

  1. Pack 2564 文章
  2. 轩辕小不懂 2403 文章
  3. 小柒 2228 文章
  4. Nen 576 文章
  5. 王昭君 217 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章