其他分享
首页 > 其他分享> > Python冷知识:如何找出新版本增加或删除了哪些标准库?

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 这项功能呢?

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

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

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

标签:python,导入机制原理,文件格式,函数,目录
来源: