内置电池是Python最为显著的特性之一,它提供了200多个开箱即用的标准库。但是,历经了30多年的发展,很多标准库已经成为了不得不舍弃的历史包袱,因为它们正在漏电! 好消息是,Python正在进行一场瘦身手术,详情可查阅:Python3。12正在移除大量的模块终于,Python标准库要做瘦身手术了!聊聊Python的内置电池 那么,我们会有这样一个话题:当Python发布了一个新版本的时候,如何找出它比上一个版本(或者更早版本)增加或删除了哪些标准库呢? 比如,当Python发布3。11。1版本时,如何找出它相比于上一个版本(即3。11。0),增删了哪些标准库呢? 也许你马上就想到了一个办法:查看官方的版本变更文档啊 没错,官方文档里肯定包含了我们所需的变更信息,但是,每个版本的《WhatsNew》里信息太多了,这种没有特定目标的搜索,只会费时费力。 假如要跨多个版本进行比较的话,比如3。12与3。10间的差异、或者未来的3。x跟现在的3。11比较,这个方法就更不好用了吧! 在3。10版本之前,想要获知标准库的变化情况,确实不太方便。但是,自3。10起,Python提供了一个非常便捷的方法:sys。stdlibmodulenames! 官方文档的描述: 来源:https:docs。python。orgzhcn3librarysys。html?sys。stdlibmodulenames 简单查看下它的内容: 如上可见,sys。stdlibmodulenames返回的是一个frozenset类型的对象,其元素是所有标准库的名称。 有了详细的标准库清单后,我们就可以通过以下的步骤,比较出不同Python版本间的差异啦: (1)获取旧版本的标准库(比如3。10。0),序列化后存储到文件数据库中importsysimportpicklewithopen(libs,wb)asf:。。。pickle。dump(sys。stdlibmodulenames,f)。。。 (2)获取新版本的标准库(比如3。11。0),与旧版本的标准库进行比较importsysimportpicklewithopen(libs,rb)asf:。。。oldlibspickle。load(f)。。。sys。stdlibmodulenamesoldlibsfrozenset({typing,scproxy,tokenize,tomllib})oldlibssys。stdlibmodulenamesfrozenset({binhex}) 从以上示例中,我们可以得知,3。11相比于3。10增加了typing、scproxy、tokenize以及tomllib,同时它也减少了一个binhex。 简简单单几行代码,这种方法比翻阅繁杂的文档要便捷且准确得多了。 值得注意的是,sys。stdlibmodulenames是3。10版本的新特性,在它之前,有一个相似的sys。builtinmodulenames,但它返回的只是被解释器使用到的内置模块: 那么,除了上文提到的获知Python标准库删减情况的用途之外,这个新特性还有什么用处呢?换句话说,Python官方为什么突然新增了sys。stdlibmodulenames这项功能呢? 原文链接:https:mp。weixin。qq。comsNoZniWQU3dUA0TmZ2kHzw 其实,社区中有一个三方库stdliblist,可用于获取部分Python版本(2。62。7;3。23。9)的标准库清单。这个库的作者在文档中提到了他的诉求,也提到其它开发者有着同样的诉求: 开发了sys。stdlibmodulenames这项功能的核心开发者VictorStinner也总结了几个使用场景:当计算项目的依赖关系时,忽略标准库中的模块:https:github。comjackmaneypyptissues3当监测第三方代码的执行时,忽略标准库,使用监测工具的ignoremodule选项:https:stackoverflow。comquestions6463918howcanigetalistofallthepythonstandardlibrarymodules在格式化Python代码文件时,对import的标准库模块进行分组。isort库包含了标准库的列表,它依据Python在线文档生成了每个版本的标准库清单:https:github。comPyCQAisorttreedevelopisortstdlibs 从这些使用场景来看,sys。stdlibmodulenames的作用还真是不小。另外,在写作本文的时候,我从CPython的Issue87121中发现,著名的机器学习库pytorch也需要这项功能。 pytorch曾经硬编码了每个Python版本的标准库列表,代码冗长,现在已经适配成使用新的方法,大大方便了后续的维护: 11月15日时,Python3。12alpha2版本发布了,这个版本开始移除大量过时的废弃的内容(标注库、标准库的子模块、类和函数等)。感兴趣的同学,可以用本文介绍的冷知识,去看看到底出现了哪些变化啦