Python冷知识:如何找出新版本增加或删除了哪些标准库?

简介: Python冷知识:如何找出新版本增加或删除了哪些标准库?

“内置电池”是 Python 最为显著的特性之一,它提供了 200 多个开箱即用的标准库。但是,历经了 30 多年的发展,很多标准库已经成为了不得不舍弃的历史包袱,因为它们正在“漏电”!

好消息是,Python 正在进行一场“瘦身手术”,详情可查阅:

那么,我们会有这样一个话题:当 Python 发布了一个新版本的时候,如何找出它比上一个版本(或者更早版本)增加或删除了哪些标准库呢?

比如,当 Python 发布 3.11.1 版本时,如何找出它相比于上一个版本(即 3.11.0),增删了哪些标准库呢?

也许你马上就想到了一个办法:查看官方的版本变更文档啊~

没错,官方文档里肯定包含了我们所需的变更信息,但是,每个版本的《What's New》里信息太多了,这种没有特定目标的搜索,只会费时费力。

假如要跨多个版本进行比较的话,比如 3.12 与 3.10 间的差异、或者未来的 3.x 跟现在的 3.11 比较,这个方法就更不好用了吧!

在 3.10 版本之前,想要获知标准库的变化情况,确实不太方便。但是,自 3.10 起,Python 提供了一个非常便捷的方法:sys.stdlib_module_names

官方文档的描述:

image.png

来源:docs.python.org/zh-cn/3/lib…

简单查看下它的内容:

image.png

如上可见,sys.stdlib_module_names 返回的是一个 frozenset 类型的对象,其元素是所有标准库的名称。

有了详细的标准库清单后,我们就可以通过以下的步骤,比较出不同 Python 版本间的差异啦:

(1)获取旧版本的标准库(比如 3.10.0),序列化后存储到文件/数据库中

>>> import sys
>>> import pickle
>>> with open("libs", "wb") as f:
...     pickle.dump(sys.stdlib_module_names, f)
...

(2)获取新版本的标准库(比如 3.11.0),与旧版本的标准库进行比较

>>> import sys
>>> import pickle
>>> with open("libs", "rb") as f:
...     old_libs = pickle.load(f)
...
>>> sys.stdlib_module_names - old_libs
frozenset({'_typing', '_scproxy', '_tokenize', 'tomllib'})
>>> old_libs - sys.stdlib_module_names
frozenset({'binhex'})

从以上示例中,我们可以得知,3.11 相比于 3.10 增加了_typing_scproxy_tokenize 以及 tomllib,同时它也减少了一个binhex

简简单单几行代码,这种方法比翻阅繁杂的文档要便捷且准确得多了。

值得注意的是,sys.stdlib_module_names 是 3.10 版本的新特性,在它之前,有一个相似的sys.builtin_module_names ,但它返回的只是被解释器使用到的内置模块:

image.png

那么,除了上文提到的获知 Python 标准库删减情况的用途之外,这个新特性还有什么用处呢?换句话说,Python 官方为什么突然新增了sys.stdlib_module_names 这项功能呢?

原文链接:mp.weixin.qq.com/s/NoZniWQU3…

其实,社区中有一个三方库stdlib-list ,可用于获取部分 Python 版本(2.6-2.7;3.2-3.9)的标准库清单。这个库的作者在文档中提到了他的诉求,也提到其它开发者有着同样的诉求

image.png

开发了 sys.stdlib_module_names 这项功能的核心开发者 Victor Stinner 也总结了几个使用场景:

  • 当计算项目的依赖关系时,忽略标准库中的模块:github.com/jackmaney/p…
  • 当监测第三方代码的执行时,忽略标准库,使用监测工具的--ignore-module选项:stackoverflow.com/questions/6…
  • 在格式化 Python 代码文件时,对 import 的标准库模块进行分组。isort 库包含了标准库的列表,它依据 Python 在线文档生成了每个版本的标准库清单:github.com/PyCQA/isort…

从这些使用场景来看,sys.stdlib_module_names 的作用还真是不小。另外,在写作本文的时候,我从 CPython 的 Issue #87121 中发现,著名的机器学习库pytorch 也需要这项功能。

pytorch 曾经硬编码了每个 Python 版本的标准库列表,代码冗长,现在已经适配成使用新的方法 ,大大方便了后续的维护:

image.png

11 月 15 日时,Python 3.12 alpha 2 版本发布了,这个版本开始移除大量过时的废弃的内容(标注库、标准库的子模块、类和函数等)。感兴趣的同学,可以用本文介绍的“冷知识”,去看看到底出现了哪些变化啦~


目录
相关文章
|
22天前
|
Ubuntu Shell Linux
pyenv 管理多个 Python 版本(1)
pyenv 管理多个 Python 版本(1)
153 86
pyenv 管理多个 Python 版本(1)
|
17天前
|
Shell Python
使用 pyenv 来管理多个 Python 版本(2)
使用 pyenv 来管理多个 Python 版本(2)
108 71
使用 pyenv 来管理多个 Python 版本(2)
|
22天前
|
XML JSON 数据库
Python的标准库
Python的标准库
162 77
|
2月前
|
机器学习/深度学习 算法 数据挖掘
数据分析的 10 个最佳 Python 库
数据分析的 10 个最佳 Python 库
98 4
数据分析的 10 个最佳 Python 库
|
23天前
|
XML JSON 数据库
Python的标准库
Python的标准库
47 11
|
2月前
|
人工智能 API 开发工具
aisuite:吴恩达发布开源Python库,一个接口调用多个大模型
吴恩达发布的开源Python库aisuite,提供了一个统一的接口来调用多个大型语言模型(LLM)服务。支持包括OpenAI、Anthropic、Azure等在内的11个模型平台,简化了多模型管理和测试的工作,促进了人工智能技术的应用和发展。
129 1
aisuite:吴恩达发布开源Python库,一个接口调用多个大模型
|
2月前
|
XML 存储 数据库
Python中的xmltodict库
xmltodict是Python中用于处理XML数据的强大库,可将XML数据与Python字典相互转换,适用于Web服务、配置文件读取及数据转换等场景。通过`parse`和`unparse`函数,轻松实现XML与字典间的转换,支持复杂结构和属性处理,并能有效管理错误。此外,还提供了实战案例,展示如何从XML配置文件中读取数据库连接信息并使用。
Python中的xmltodict库
|
23天前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
64 8
|
2月前
|
存储 人工智能 搜索推荐
Memoripy:支持 AI 应用上下文感知的记忆管理 Python 库
Memoripy 是一个 Python 库,用于管理 AI 应用中的上下文感知记忆,支持短期和长期存储,兼容 OpenAI 和 Ollama API。
100 6
Memoripy:支持 AI 应用上下文感知的记忆管理 Python 库
|
1月前
|
安全 API 文件存储
Yagmail邮件发送库:如何用Python实现自动化邮件营销?
本文详细介绍了如何使用Yagmail库实现自动化邮件营销。Yagmail是一个简洁强大的Python库,能简化邮件发送流程,支持文本、HTML邮件及附件发送,适用于数字营销场景。文章涵盖了Yagmail的基本使用、高级功能、案例分析及最佳实践,帮助读者轻松上手。
35 4