發(fā)布于:2020-12-30 15:17:50
0
141
0
在2014年的Pycon中,Python的創(chuàng)建者Guido van Rossum以及當時的語言“生命的仁慈獨裁者”站在一件襯衫上,上面寫著大2.8的大寫字母,上面有一個大紅色沒有進入標志。他說:“現(xiàn)在是進入Python 3的時候了,”他告訴聽眾他們應(yīng)該開始在工作流程中采用該語言的新版本。
經(jīng)過核心提交者和周圍的圖書館社區(qū)為實現(xiàn)該目標而進行的多年努力,Python 2終于壽終正寢。根據(jù)pythonclock.org的說法,2020年1月1日是支持Python 2的截止日期。
對于幾年前已經(jīng)做出更改的一些公司來說,這將不是問題。但是,出于多種原因,很多公司都不會在短期內(nèi)進行更改。
對于大量使用該語言的公司,尤其是那些可能不準備遷移的公司,此更改意味著什么?為了了解正在發(fā)生的事情的整個上下文,讓我們回顧一下Python的歷史。
Python簡史
開發(fā)Python 3的想法是實現(xiàn)一個重大更改,從而擺脫了Python中的一個遺留問題:在幕后將所有字符串都呈現(xiàn)為Unicode。正如Python的核心開發(fā)人員之一布雷特·坎農(nóng)(Brett Cannon)寫道,
人們有時會忘記Python的年代。Guido于1989年12月開始對Python進行編碼,并于1991年2月首次作為開源發(fā)布。這意味著Python本身早于1991年10月發(fā)布的Unicode標準的第一卷。在過去的幾年中,Unicode標準化之后創(chuàng)建的語言選擇將其實現(xiàn)的字符串基于可支持Unicode的編碼。
支持任何書面語言的Unicode和文本非常重要。Python是一種世界語言,而不僅僅是支持ASCII覆蓋的羅馬字母的語言。這就是為什么Python 3在處理文本時將其設(shè)置為“ Unicode或破產(chǎn)”的原因。它保證了所有Python 3代碼都將支持世界上的每個人,無論編寫該代碼的開發(fā)人員是否明確打算這樣做。
不幸的是,該團隊假設(shè)每個人都將立即進行大的切換,并使Python 3向后不兼容,并將2設(shè)置為維護分支。但是,許多人不想切換,因為正如改進的PEP所說,Python 3是“相對于Python 2而言相對溫和的改進”。許多人并沒有因為他們認為最大的不便而改用。當時,最大的區(qū)別是將print語句更改為Python函數(shù)語法,這破壞了很多代碼。
結(jié)果,Python 2繼續(xù)處于積極的開發(fā)中。不過,在2019年,Python 3終于(大部分)成為了新Python開發(fā)的默認語言版本,許多公司和項目都在使用Python 3的主要功能:f字符串,Path,類型提示,異步和,當然是Unicode渲染。
緩慢的采用過程
自從新的主要版本于2008年宣布以來,采用Python 3一直很漫長。Dustin顯示了采用了多長時間:
最初,有很多理由不采用Python 3:最重要的是,它與Python 2并沒有向后兼容。結(jié)果,主要的庫都猶豫不決地遷移到平臺上,這是一個自我實現(xiàn)的預(yù)言。 ,并且很難通過缺乏支持工具來移植代碼(最終使用2to3和6這樣的方法解決了)。
轉(zhuǎn)換的轉(zhuǎn)折點發(fā)生在大約2016年左右的Python 3.5發(fā)行版中,該版本具有矩陣乘法,asyncio的引入,OrderedDict的速度改進以及類型提示的實現(xiàn),這些提示為Python帶來了一些類似于靜態(tài)語言的功能。
更高版本包含更多功能,例如Pathlib庫和f字符串操作。通過這些更改,人們使用了許多庫(例如用于機器學(xué)習(xí)的scikit-learn)開始了向Python 3的遷移。
隨著越來越多的依賴關(guān)系開始升級,公司也開始遷移。
因此,既然我們快要結(jié)束了,那么從開發(fā)中終止Python 2對依賴它的開發(fā)人員生態(tài)系統(tǒng)意味著什么?
從Internet上的狀態(tài)來看,您可能以為每個人都完成了遷移。在Jetbrains進行的一項調(diào)查中,該公司生產(chǎn)像IntelliJ和PyCharm這樣的IDE,有75%的個人受訪者表示他們已經(jīng)遷移了。一連串的博客文章也表明了這一點。例如,Dropbox于2018年秋季詳細說明了他們的遷移。Instagram于2017年遷移。Facebook于2014年 開始。在其客戶的敦促下,Splunk最近也這樣做了。
但是,僅僅因為Python 2即將到期,并不意味著公司會在一夜之間停止使用它。我們怎么知道Python 2仍在投入大量精力?我們可以使用Python包庫PyPI直接查看發(fā)生了什么。在2016年,PyPI背后的核心開發(fā)人員開始向Google的BigQuery發(fā)送日志,以便能夠針對它們運行SQL,這使得根據(jù)使用情況做出體系結(jié)構(gòu)決策變得更加容易。
例如,如果要查看過去30天內(nèi)通過Python版本下載了哪些庫,則可以在BigQuery中創(chuàng)建一個新項目(每月查詢的前1 TB是免費的),然后運行:
SELECT REGEXP_EXTRACT(details.python, r"^([^.]+.[^.]+)") as python_version, COUNT(*) as download_count, FROM TABLE_DATE_RANGE( [the-psf:pypi.downloads], DATE_ADD(CURRENT_TIMESTAMP(), -31, "day"), DATE_ADD(CURRENT_TIMESTAMP(), -1, "day") ) GROUP BY python_version, ORDER BY download_count DESC LIMIT 100
盡管Python 3在社區(qū)中已經(jīng)成為主流版本至少一年了,但從PyPI下載的單個軟件包的最新數(shù)量顯示,2019年9月所有軟件包中至少有40%為2.7下載。誠然,這比年初的60%有所下降,但是鑒于EOL距離只有數(shù)月之遙,所以這仍然很重要。
在每個庫的基礎(chǔ)上,它變得有些棘手:大多數(shù)Flask下載使用Python 3版本完成,但是只有26%的botocore下載(適用于Python的AWS開發(fā)工具包)使用Python 3。
而且,有幾個庫需要進行遷移:Twisted(僅部分移植的Web框架)和PyPy(常用的JIT編譯器)將無限期保留版本2。
任何給定軟件的使用壽命終止通常并不意味著該軟件不再可用。這確實意味著它不再針對任何安全漏洞或添加任何其他錯誤修復(fù)程序進行更新。規(guī)范壽命終止的Python PEP(語言規(guī)范)規(guī)定,
此聲明不能保證會定期發(fā)布錯誤修正,但是它應(yīng)該使希望為Python 2.7貢獻錯誤修正的志愿者能夠使用,并且應(yīng)該使仍然需要支持Python 2的供應(yīng)商滿意。
但是,不更新到Python 3會帶來很多風險-最重要的是,丟失安全更新,不利用類型提示和速度提升等新功能的風險。
為什么采用率這么慢
那么,為什么在截止日期之前我們采用率更高呢?
在開玩笑的帖子中,我寫道IT在Java 8上運行(按當今的標準,這是古老的)
根據(jù)2018年的JVM生態(tài)系統(tǒng)報告, Java 8仍然是主要的開發(fā)環(huán)境。
這就是答案:大多數(shù)大型組織都在技術(shù)新聞發(fā)布的炒作周期之外,而移動的速度卻比媒體或博客所想的要慢得多。例如,大多數(shù)主要銀行仍在運行FORTRAN和COBOL的某些變體。
因此,盡管許多公司概述了他們的遷移策略,但相同或更多的量將長期保留在Python 2上。為什么會這樣呢?
在閱讀已經(jīng)遷移人員的賬目時,很容易看出:遷移代碼庫需要很長時間,這是一個高度政治決定,并且即使在技術(shù)含量最高的公司中,也有慣用的意圖。
例如,為了在Facebook上使用Python 3,Jason Fried從2014年開始重寫服務(wù)。一路走來,他犯了很多錯誤,更改了很多代碼,并做了很多修改以使其廣為人知人們正在做Facebook之類的事情,例如參加新的開發(fā)人員培訓(xùn),從而開始使用Python 3。然后,他與?ukaszLanga合作,后者將Instagram轉(zhuǎn)換為Python 3:
2016年,他和Langa在Facebook上組建了一個全新的團隊,以在公司內(nèi)部管理Python,他們將其稱為“愚蠢的步行部”。因為他們是“ Python團隊”,所以他前面提到的“公認的權(quán)威”起作用了。人們認為他們可以在Facebook上做出有關(guān)Python的決定。
Instagram的舉動本身耗時10個月。Guido和Langa現(xiàn)在在其中工作的Dropbox花費了三年時間,直到Guido幾周前退休,該工作仍在進行中。誠然,所有這些都是巨大的代碼庫,但是您必須懷疑:如果Python的高層人員從事此工作需要花費這么長時間,那么對于一家正規(guī)公司來說可能要花費多長時間,也許是其中Python甚至不是主要語言的公司?
在所有情況下,政治發(fā)揮的作用與技術(shù)指導(dǎo)一樣重要。
第二,安全問題是一個問題。具有諷刺意味的是,您會認為不進行升級將帶來更大的風險,但是在大型組織中,不允許許多人自己升級Python:管理員或安全團隊向他們推送更新。在某些情況下,也不允許下載PIP。如果Python 2是安全團隊同意的默認協(xié)議,那么它可能需要付出巨大的努力才能說服人們將其切換到3,尤其是在受到嚴格監(jiān)管(例如醫(yī)療保健或金融)和政府的環(huán)境中。
這將我們帶到第三個原因:慣性。盡管許多版本的Linux(例如RHEL)在Python 2和Python 2之間都包括了Python 3,但這絕不是默認值,在2和3之間切換時,經(jīng)常發(fā)現(xiàn)一些錯誤,尤其是指向系統(tǒng)版本的指針例如,在Debian上的Python 。
Python經(jīng)歷了從2到3的漫漫長路,個人和具有前瞻性的初創(chuàng)公司都采用了它?,F(xiàn)在,第二大遷移將發(fā)生在大型企業(yè)從2開始遷移的時候。關(guān)于Python 2,我們將看到2020年40%的數(shù)量進一步減少,但這種變化將是逐步的,并且將會有運行Python的公司2.7走向未來。