当前位置: 首页 > 后端技术 > Python

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

时间:2023-03-25 21:57:06 Python

“内置电池”是Python最显着的特性之一,它提供了200多个开箱即用的标准库。然而,经过30多年的发展,很多标准库已经成为不得不丢弃的历史包袱,因为它们是“漏”!好消息是Python正在进行“瘦身手术”。详情请参考:Python3.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),序列化后存放在文件/中database>>>importsys>>>importpickle>>>withopen("libs","wb")asf:...pickle.dump(sys.stdlib_module_names,f)...(2)获取新版本标准库(如3.11.0),与旧版本标准库对比>>>importsys>>>importpickle>>>withopen("libs","rb")asf:...old_libs=pickle.load(f)...>>>sys.stdlib_module_names-old_libsfrozenset({'_typing','_scproxy','_tokenize','tomlib'})>>>old_libs-sys.stdlib_module_namesfrozenset({'binhex'})从上面的例子我们可以知道3.11相比3.10增加了_typing、_scproxy、_tokenize和tomllib,还减少了一个binhex。只需几行代码,这种方法比翻阅复杂的文档要方便和准确得多。值得注意的是,sys.stdlib_module_names是3.10版本的新特性。在它之前,有一个类似sys.builtin_module_names的,但是它只返回解释器使用的内置模块:所以,除了上面提到的知识之外,这个新特性的用途是什么?标准库修剪案例?或者说,为什么Python官方突然增加了sys.stdlib_module_names这个函数呢?