科普一个 Python冷知识

news/2024/9/24 12:19:30/

图片

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

那么,我们会有这样一个话题:当 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),序列化后存储到文件/数据库

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

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

python">>>> 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 也总结了几个使用场景:

  • 当计算项目的依赖关系时,忽略标准库中的模块: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 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费


http://www.ppmy.cn/news/1433892.html

相关文章

嵌入式物联网实战开发笔记-乐鑫ESP32芯片功能对比以及功能选型【doc.yotill.com】

乐鑫ESP32入门到精通项目开发参考百例下载: 链接:https://pan.baidu.com/s/1ATvRnAZvxkev-PJfd3EAPg?pwd4e33 提取码:4e33 2.1 初识 ESP32 ESP32-S3 是一款低功耗的 MCU 系统级芯片 (SoC),支持 2.4 GHz Wi-Fi 和低功耗蓝牙 (…

Pandas 2.2 中文官方教程和指南(五)

原文:pandas.pydata.org/docs/ 与 SAS 的比较 译文:pandas.pydata.org/docs/getting_started/comparison/comparison_with_sas.html 对于来自SAS的潜在用户,本页面旨在演示如何在 pandas 中执行不同的 SAS 操作。 如果您是 pandas 的新手&am…

PHP中的超全局变量及其作用

PHP中的超全局变量及其作用 在PHP编程中,超全局变量是一类非常特殊的变量,它们可以在脚本的任何地方,包括函数或方法内部,无需任何特殊的声明或调用,即可直接访问。这些变量是PHP预先定义好的,它们提供了对…

Science Robotics 美国斯坦福大学研制了外行星洞穴探测机器人

月球和火星上的悬崖、洞穴和熔岩管已被确定为具有地质和天体生物学研究理想地点。由于其隔绝特性,这些洞穴提供了相对稳定的条件,可以促进矿物质沉淀和微生物生长。在火星上,这些古老的地下环境与火星表面可能适合居住时几乎没有变化&#xf…

python学习笔记(常用的方法)

方法1:字符串中元素大小写 1.name.title():首字母大写 2.name.upper():全部大写 3.name.lower():全部小写 # 字母大小写 nametian yang print(name.title()) # 首字母大写 print(name.upper()) # 全部大写 print(name.lower()) # 全部小写 Tian Yang TIAN YANG tia…

【PCL】教程 interactive_icp.cpp 使用ICP算法对3D点云进行准确的对齐,并通过可视化展示算法的迭代过程...

测试程序 ./interactive_icp ../monkey.ply 5 终端输出: [pcl::PLYReader::listPropertyDefinitionCallback] no fitting callbacks. element_nameface, property_namevertex_indices [pcl::PLYReader] monkey.ply:14: property list uint8 uint32 vertex_indices o…

电脑问题快速判断

电脑开机没有任何反应 检查电源 检查电源是否有问题或损坏,可以短接方法检测 板电源卡口对自己接第四或第五根线,若风扇匀速转动,电源无问题,若不转动或转一下停一下,电源有问题 检查内部连线 确保主板上的线插的…

【每日刷题】Day22

【每日刷题】Day22 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 1669. 合并两个链表 - 力扣(LeetCode) 2. 11. 盛最多水的容器 - 力扣&#…