Python冷知識:如何找出新版本增加或刪除了哪些標準庫?

2022-11-19 12:00:12

「內建電池」是 Python 最為顯著的特性之一,它提供了 200 多個開箱即用的標準庫。但是,歷經了 30 多年的發展,很多標準庫已經成為了不得不捨棄的歷史包袱,因為它們正在「漏電」!

好訊息是,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 返回的是一個 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/NoZniWQU3dUA_0TmZ2kHzw

其實,社群中有一個三方庫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 也需要這項功能。

pytorch 曾經寫死了每個 Python 版本的標準庫列表,程式碼冗長,現在已經適配成使用新的方法 ,大大方便了後續的維護:

11 月 15 日時,Python 3.12 alpha 2 版本釋出了,這個版本開始移除大量過時的廢棄的內容(標註庫、標準庫的子模組、類和函數等)。感興趣的同學,可以用本文介紹的「冷知識」,去看看到底出現了哪些變化啦~

首發於 Python貓 ,如需轉載,請聯絡作者

知乎:Python貓

部落格園:豌豆花下貓

掘金:豌豆花下貓

CSDN:Python貓