國慶假期,Python 社群釋出了 3.9 版本的第一個 stable release。
相比于 3.8,Python 3.9 新特性衆多,但不少特性與大多數 Python“使用者”(而非 CPython 的貢獻者或使用 C 接口編寫擴充的開發者)關系不大。
本文将站在 Python “使用者”的角度,簡單介紹新特性中很可能會與各位的日常開發産生關系的幾個。
字典“并集”運算符
“并集”運算符顧名思義就是給兩個字典取并,并産生新的字典對象。
熟悉 collections 标準庫的開發者聽到這一特性想必很容易聯想到 ChainMap,兩者的差別是“并集”運算符會直接産生新的對象,而 ChainMap 産生的是與輸入的對象相關聯的視圖——視圖對象或輸入對象的變化都會直接對對方産生影響。
字典“并集”運算符及其相對應的原地運算符的效果如圖:
也許有同學會質疑“并集”運算符的意義,畢竟使用如下的寫法也能相對簡潔地合并字典:
就筆者的了解(且不提上述三種寫法有多少開發者能夠想到),“并集”運算符的優勢在于不會丢失參與合并字典的類型資訊,且對字典鍵的類型沒有要求;
此外,經過簡單測試,“并集”運算符在性能上也更有優勢。
類型提示的改善
Python 3.9 為内置的以及标準庫中的集合類型提供了用于類型提示中的泛型的支援。如:
這一支援解決了一直以來 Python 代碼中會出現兩種 list(list 和 typing.List)類型的尴尬情況。需要注意的是,泛型化的内置類型仍然支援執行個體化,但不能被用于 isinstance 和 issubclass 判斷,這一設計應該 Python 社群是結合了代碼表意性和性能作出的綜合考量:
此外,typing 庫加入了新的類型 Annotated,通過使用 Annotated,開發者可以為内置的或自定義的類型附加更多的資訊。
一種可能的使用場景:Annotated 中的類型資訊供 IDE 或 代碼審查工具靜态地檢查變量類型,而附加的資訊則可以在運作時産生更豐富的作用——PEP 593 中展示了一個類似的例子。
檢視PEP 593:
https://www.python.org/dev/peps/pep-0593/#combining-runtime-and-static-uses-of-annotations
裝飾器文法更加靈活
舊版本的 Python 對裝飾器的文法有所限制,Python 3.9 将這一限制放寬——任意“表達式”均可用在裝飾器中。
如果讀者對“任意表達式”這一概念感到模糊,可以參考 if 或 while 語句,在 Python 3.9 中,任意可以用在 if 或 while 測試部分的語句都可以成為裝飾器而不會産生文法錯誤。
如下圖所示,甚至匿名函數也可以直接作為裝飾器(雖然圖中的做法毫無意義,在此僅僅為了示範文法特性),在 Python 3.8 或之前的版本中,這樣的寫法會引發 SyntaxError。
PEP-614 為我們展示了一個更有實用價值的例子 —— 在編寫 PyQt5 代碼時為按鈕清單中的每個元素分别注冊事件。
檢視PEP 614:
https://www.python.org/dev/peps/pep-0614/#motivation
classmethod 支援包裝其他描述器
Python3.9 中的 classmethod 函數增加了對包裝其他描述器(descriptor)的支援。
如下圖所示,現在我們可以結合 classmethod 和 property 輕松創造出一個類的屬性(在 3.8 及之前的版本中,開發者需要手工實作一個描述器以支援類似的功能)。
新增子產品、函數、方法
包括且不限于:
- 标準庫中添加了時區資料庫子產品 zoneinfo
- 内置的字元串類型加入了新的掐頭去尾方法 removeprefix 和 removesuffix
- math 子產品中新增了多個數學運算函數
參考資料
1.Python.org
2.Python Enhancement Proposals (PEPs)
3.Python Documentation
4. Ricequant
上文中介紹的特性僅僅是 Python 3.9 更新中的冰山一角,想要更全面地了解 Python 3.9,您可以:
-
直接通路文檔
https://docs.python.org/3.9/whatsnew/3.9.html#what-s-new-in-python-3-9
-
下載下傳 Python3.9 的安裝器或源碼(anaconda 頻道中尚未提供 Python 3.9)自行體驗。
https://www.python.org/downloads/release/python-390/
Only action can relieve the uneasiness.