溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何移除舊的版本特性迎接新的特性

發布時間:2021-12-02 18:08:07 來源:億速云 閱讀:135 作者:柒染 欄目:大數據

今天就跟大家聊聊有關Python如何移除舊的版本特性迎接新的特性,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

2020 年 4 月 20 日,Python 2 的最后一個版本 2.7.18 發布了,這意味著 Python 2 是真正的 EOL(end of life)了,一個時代終于落幕了。

Python 2.0 版本是在 2000 年發布的,至今正好到 20 周年(差半年),一代版本竟然持續了這么長時間。其中,2.7 版本是在 Python 3 推出后才發布的,它在 2010 年發布,至今已是 10 年之久。

Python如何移除舊的版本特性迎接新的特性  

事實上,Python 誕生了 30 年,但版本演進過程一直很慢,目前最新發布的版本只到 3.8.2。

對比一下相差幾歲的隔壁家選手,C++ 已經發展到了 20,JAVA 發展到了 14 ,PHP 到了 7.4,差距懸殊。

但是,版本發布太頻繁,也不總是一件好事。就在 Python 程序員抱怨自己的 Python 2 項目還沒升 3 版本時,有些 JAVA 程序員還在維護 6、7 版本的項目呢。版本遷移之苦,大家彼此彼此,五十步笑百步。

編程語言跨版本間出現不兼容的特性,幾乎是常態。很多時候,并不是說過去的設計是 bug,只是因為編程語言也是某種“生命體”,它會學習其它語言,也會自我進化,所以就有新陳代謝。

擺脫舊的不兼容性版本或者某些落后的設計,有時候需要挺漫長的過渡期。為了方便程序員遷移,核心開發者們形成了一些有效的慣例。

以 Python 為例,我知道有以下的幾種策略:

 

1、DeprecationWarning 提示

當使用過期的類或方法時,會出現 DeprecationWarning 告警。

例如,從 collections 模塊導入 ABC(Abstract Base Classes,即抽象基類)就是過期用法,會出現以下提示:

Python如何移除舊的版本特性迎接新的特性  

DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.9 it will stop working

從 3.3 版本起,正確的用法是from collections.abc import Iterable,直到 3.9 版本時,會取消過期提示,出現報錯。

 

2、將模塊改名,約定為私有

在 Python 中,以單下劃線“_”開頭命名的變量,會被約定為私有的。如果在一個模塊中定義了私有變量,理論上它就不該被導出到其它模塊使用。

這種命名方式也被推廣到了標準模塊上。例如,在 Python 的極早期版本中有一個thread 模塊,后來到 1.5.1 版本,以 thread 為基礎又推出一個更方便好用的threading 模塊,也就是我們熟知的實現多線程的模塊。

為了擺脫/屏蔽舊的實現,Python 把 thread 模塊重命名為_thread ,約定為私有的,這種方式很靈活,普通程序員不會感知它的存在,骨灰級程序員卻可以用它實現更加低層的開發。

Python如何移除舊的版本特性迎接新的特性  
 

3、文檔中作 deprecated 提示

它跟 DeprecationWarning 是同樣的意思。之所以要單獨列出來,是因為在構思本文時,我正巧在 Python 3.8 文檔中發現了一則提示,忍不住分享一下。

文檔中說:@asyncio.coroutine 裝飾器不再支持基于yield from 生成器實現的協程,需要顯式地寫成“asyc def”這種定義方式。

Python如何移除舊的版本特性迎接新的特性  

這意味著,3.8 版本對該特性來說就是個分界線,它將進入一個平穩的淘汰周期。

以上三種方式可謂是“除舊”,是面向過去的版本所做的。與它們相對應,就少不了“迎新”的過程,要面向未來的版本。

Python 中有時候會在當前版本中加入一些實驗性的特性,期待在未來版本中再完全地實現。而這,就需要給程序員們指出一些過渡性的提示。

例如,在《Python 3.9 性能優化:更快的 list()、dict() 和 range() 等內置類型》一文中,我就介紹了隱藏在 3.8 版本中的“vectorcall”協議,它要在 3.9 版本中才會真正地實現(而且不排除在未來還會繼續擴展)。

此外,還有一個很著名的例子:3.2 版本中推出的 concurrent.futures標準庫(依據 PEP-3148)。

這是一個統合了多線程與多進程的異步開發庫,“concurrent”指的是并發,而“并發”概念可以囊括多線程與多進程的實現方式。

為什么在“concurrent”下面要加一個“futures”呢?PEP-3148 中指出了這樣命名的三點原因,其中最后一點是:希望在將來(in the future)能夠添加和移動現有的跟并發相關的庫到concurrent庫下面。

也就是說,3.2 版本的concurrent.futures就是一種實驗性的設計,它是為將來更好的concurrent庫而作的準備。雖然說將來的最終實現,可能跟 PEP 中設想的不同,但是,這種面向將來的長遠考慮的設計思路,會給整個社區帶來某種預期和共同的信念。

看完上述內容,你們對Python如何移除舊的版本特性迎接新的特性有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女