乐趣区

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

“内置电池”是 Python 最为显著的个性之一,它提供了 200 多个开箱即用的规范库。然而,历经了 30 多年的倒退,很多规范库曾经成为了不得不舍弃的历史包袱,因为它们正在“漏电”!

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

  • Python 3.12 正在移除大量的模块
  • 终于,Python 规范库要做“瘦身手术”了!
  • 聊聊 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

官网文档的形容:

起源:https://docs.python.org/zh-cn/3/library/sys.html?#sys.stdlib_module_names

简略查看下它的内容:

如上可见,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,但它返回的只是被解释器应用到的内置模块:

那么,除了上文提到的获知 Python 规范库删减状况的用处之外,这个新个性还有什么用途呢?换句话说,Python 官网为什么忽然新增了sys.stdlib_module_names 这项性能呢?

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

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

开发了 sys.stdlib_module_names 这项性能的外围开发者 Victor Stinner 也总结了几个应用场景:

  • 当计算我的项目的依赖关系时,疏忽规范库中的模块:https://github.com/jackmaney/pypt/issues/3
  • 当监测第三方代码的执行时,疏忽规范库,应用监测工具的 --ignore-module 选项:https://stackoverflow.com/questions/6463918/how-can-i-get-a-list-of-all-the-python-standard-library-modules
  • 在格式化 Python 代码文件时,对 import 的规范库模块进行分组。isort 库蕴含了规范库的列表,它根据 Python 在线文档生成了每个版本的规范库清单:https://github.com/PyCQA/isort/tree/develop/isort/stdlibs

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

pytorch 已经硬编码了每个 Python 版本的规范库列表,代码简短,当初曾经适配成应用新的办法,大大不便了后续的保护:

11 月 15 日时,Python 3.12 alpha 2 版本公布了,这个版本开始移除大量过期的废除的内容(标注库、规范库的子模块、类和函数等)。感兴趣的同学,能够用本文介绍的“冷常识”,去看看到底呈现了哪些变动啦~

首发于 Python 猫,如需转载,请分割作者

知乎:Python 猫

博客园:豌豆花下猫

掘金:豌豆花下猫

CSDN:Python 猫

退出移动版