中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

從Python2到Python3,“遷移與否”是個(gè)大問(wèn)題

2019-12-03    來(lái)源:raincent

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

作者:Sebastian Witowski 譯者:李冬梅 來(lái)源:InfoQ

很負(fù)責(zé)任地告訴你,你可以放棄 Python 2.0 版本了,因?yàn)?Python 3 簡(jiǎn)直棒極了。當(dāng)然,如果你能把項(xiàng)目從 Python 2 轉(zhuǎn)移到 Python 3,那就更好了。盡管 Python 3 大受贊揚(yáng),但如何將Python 2 中大量的應(yīng)用“遷移到 Python 3 中這個(gè)問(wèn)題一直困擾著技術(shù)人員們,這篇文章就為你答疑解惑。

Python 2 即將退出歷史舞臺(tái)

Python 3 已經(jīng)發(fā)布十年了。Python 2 的產(chǎn)品壽命結(jié)束時(shí)間最初被設(shè)定為 2015 年,但是它被延長(zhǎng)到了 2020 年 1 月 1 日——原因是 2013 和 2014 這兩年間,人們還沒(méi)做好準(zhǔn)備將項(xiàng)目“遷移”到 Python 3 上。Python 3.0 幾乎無(wú)法使用,Python 3.1 和 3.2 比 Python 2 運(yùn)行慢。造成這種問(wèn)題的根源在于許多第三方庫(kù)仍然使用 Python 2。直到 2012 年,200 個(gè)最常用的 Python 包中僅有一半遷移到了 Python 3 上,而到了 2018 年,仍然只有 95% 左右的 Python 包被遷移過(guò)來(lái),這還都是些人們最常用的 Python 包,至于那些不太常用或不流行的,就更無(wú)人問(wèn)津了,所以最后壽命結(jié)束期限又延長(zhǎng)了 5 年。這 5 年中,Python 3 的變化不可同日而語(yǔ)。Python 3(3.6 及以上版本)的最新版本不僅運(yùn)行速度快而且功能豐富。

為什么仍然有一些 Python 2 項(xiàng)目?

從業(yè)務(wù)的角度來(lái)看,遷移的成本太高了。作為開(kāi)發(fā)人員,在過(guò)去的幾年里,我們編寫(xiě)的每一行 Python 2 代碼都是一筆技術(shù)債。但大多數(shù)公司不是由開(kāi)發(fā)者運(yùn)營(yíng)的。所有的商業(yè)決策都是經(jīng)理制定的,而他們的關(guān)注點(diǎn)是那些能為公司帶來(lái)業(yè)務(wù)價(jià)值的項(xiàng)目。事實(shí)上,一種在幾個(gè)月內(nèi)就會(huì)被淘汰的編程語(yǔ)言,不足以讓人為它花費(fèi)時(shí)間重寫(xiě)所有項(xiàng)目。將項(xiàng)目從 python2 遷移到 python3 是很昂貴的,而且這么做也不會(huì)給公司帶來(lái)更多價(jià)值。雖然它會(huì)為項(xiàng)目做些改進(jìn),但卻不會(huì)為產(chǎn)品添加任何新特性。

就像女人的衣柜永遠(yuǎn)都少了一件晚禮服一樣,總是有一些新特性在等待著技術(shù)人員去開(kāi)發(fā),總有一個(gè)緊急的漏洞需要修復(fù)。如果你是“敏捷開(kāi)發(fā)”(因?yàn)楝F(xiàn)在人人都是敏捷開(kāi)發(fā)),并且有一堆待辦事項(xiàng),如果遷移到 Python 3 能排到待辦事項(xiàng)列表中,那也只能是最后一項(xiàng)。如果你是一家小型初創(chuàng)企業(yè),那么你需要的不是完美的、最新的代碼,而是要添加新功能并改善用戶體驗(yàn)。

如果你是一家大公司,那么情況就不同了。如果遷移大量遺留下來(lái)的 Python 代碼(甚至有3500 萬(wàn)行 Python 2 代碼)那絕對(duì)是一件讓人崩潰的事。更糟糕的是,如果這些代碼中有一些是已經(jīng)離職的前員工編寫(xiě)的,幾乎沒(méi)有經(jīng)過(guò)測(cè)試,文檔也很差,老舊過(guò)時(shí)。但是這些代碼仍然能正常工作,只是沒(méi)有人知道它是如何工作的,多年來(lái)都沒(méi)人用過(guò)它們。在某種程度上,你將不得不重寫(xiě)它,因此這些代碼一直“半死不活”地留在 Python2 中。

繼續(xù)使用 Python 2 的風(fēng)險(xiǎn)

我們來(lái)做個(gè)假設(shè)——時(shí)間快進(jìn)兩個(gè)月,Python 2 徹底“退休”,所有人都在準(zhǔn)備迎接 Python 3,而你只能面對(duì)著仍在 Python 2 上運(yùn)行的生產(chǎn)代碼望洋興嘆。并開(kāi)始思考:“最壞的結(jié)果是什么?”

結(jié)果就是——你可能被黑。當(dāng)然了,在 Python 3 或其他任何編程語(yǔ)言上也可能被黑,但在 Python 2 上被黑的風(fēng)險(xiǎn)更大。沒(méi)有人會(huì)再更新 Python 2,更不會(huì)有人去修復(fù)里面的 bug。這還不是最糟糕的,更糟糕的是用戶要考慮正在使用的 Package,因?yàn)榇蠖鄶?shù) Package 已經(jīng)放棄了其 Python 2 版本,明年一月將會(huì)有更多 Package 放棄 Python 2。那么,對(duì) Python 2 的依賴越大,出現(xiàn)安全問(wèn)題的可能性就越大。

即使軟件沒(méi)有任何安全問(wèn)題,隨著時(shí)間的推移,它也會(huì)慢慢地開(kāi)始崩潰。如果每次更新部分系統(tǒng)(更新系統(tǒng)保持安全),就會(huì)出現(xiàn)系統(tǒng)與新軟件不兼容的問(wèn)題。也許一些開(kāi)發(fā)人員會(huì)從 PyPI 中刪除他們的 Packages,那么最終的結(jié)果就是花越來(lái)越多的時(shí)間去填坑以使項(xiàng)目繼續(xù)運(yùn)行。

Python 2 還有救嗎?

是不是只能眼睜睜看著 Python 2“壽終正寢”無(wú)計(jì)可施?我只能說(shuō),如果可以將項(xiàng)目遷移到 Python 3,那就這么做吧。因?yàn)檫w移后得到的長(zhǎng)期收益將遠(yuǎn)遠(yuǎn)超過(guò)遷移的成本。但是如果可以遷移,相信很多人早已那么做了,就不會(huì)閱讀本文了。所以我假設(shè)你不想遷移項(xiàng)目而是在尋找其他的解決方案,下面是我列出的 Python 2 項(xiàng)目其他解決方案,從我主觀出發(fā),按照解決方案難度排序:

· 什么都不做

你可以掩耳盜鈴,假裝 Python 3 不存在,忽略 Python 2 即將“壽終正寢”的事實(shí)。正如我之前提過(guò)的,不更新軟件,“執(zhí)著”地冒著數(shù)據(jù)泄露的風(fēng)險(xiǎn)繼續(xù)使用 Python 2,即使一些依賴項(xiàng)可能在某個(gè)時(shí)間停止工作也無(wú)所謂。但是,如果僅在計(jì)算機(jī)上運(yùn)行的某種內(nèi)部腳本上使用 Python 2,而且它沒(méi)有依賴項(xiàng),那么,什么都不做就是最好的解決方案。如果你的軟件可能明年就會(huì)過(guò)時(shí),這時(shí)就要衡量下利弊再慎重決定到底要不要遷移。

· 凍結(jié)應(yīng)用狀態(tài)

對(duì)于那些你不用擔(dān)心安全問(wèn)題的內(nèi)部工具,凍結(jié)應(yīng)用狀態(tài)是個(gè)不錯(cuò)的解決方案(這里所說(shuō)的“內(nèi)部”是指斷網(wǎng)狀態(tài))。但如果一些依賴項(xiàng)出現(xiàn)漏洞,那就麻煩了。明年依賴 Python 2 的項(xiàng)目就會(huì)開(kāi)始出現(xiàn)問(wèn)題,就像我上文提到的,人們會(huì)從 GitHub 甚至 PyPI 上刪除舊項(xiàng)目,你還記得刪除一個(gè)填充文本的庫(kù)結(jié)果所有構(gòu)建的代碼開(kāi)始崩潰的烏龍事件嗎?那時(shí)候所有人都嘲笑了 JavaScript,那就做好準(zhǔn)備迎接同樣的嘲笑吧,只是,可能都不會(huì)有人嘲笑你了,因?yàn)槟闼褂玫氖荘ython 的棄用版本。

幸運(yùn)的是,我們還有 docker 和其他允許你創(chuàng)建 immutable containers 的工具。編寫(xiě)一個(gè)使用 Python 2 作為基本映像的 Dockerfile。添加依賴項(xiàng)并將應(yīng)用設(shè)置成一個(gè) docker 鏡像。將設(shè)置好的 image 推入公共或私人存儲(chǔ)庫(kù)。于是,你就擁有了一個(gè)帶有辦公應(yīng)用的 immutable container,你可以共享它并按照自己的用途使用它,而不必?fù)?dān)心某些依賴項(xiàng)不可用。它解決了內(nèi)部工具的大多數(shù)問(wèn)題,F(xiàn)在能用就快使用吧,別等到 2020 年應(yīng)用開(kāi)始出現(xiàn)各種問(wèn)題時(shí)再使用就為時(shí)已晚了。

· 改變 Python 翻譯器

當(dāng)我提及“Python 2 不再使用”時(shí),我的意思是“CPython 2 不再使用”。CPython 是最流行的 Python 翻譯器,所以對(duì)于很多人來(lái)說(shuō),Python == CPython。但它不是唯一的翻譯器。例如,還有可以替代 CPython 的 PyPy。

那么,為什么不是所有人都使用 PyPy 呢?因?yàn)?PyPy 有一些限制。如果你的項(xiàng)目非常依賴 C 擴(kuò)展,那么 PyPy 可能不適合你。但如果你切換到 PyPy,需要用測(cè)試來(lái)驗(yàn)證是否所有程序正常運(yùn)行,如果能夠運(yùn)行,你的應(yīng)用程序甚至可能比以前運(yùn)行得更快。不得不說(shuō),這是一個(gè)很好的“副作用”。

PyPy 不是唯一的選擇。Intel 保留了自己的 Python 發(fā)行版,稱為“Intel®Python 發(fā)行版”。這是一個(gè)支持 Python 的 2.7 和 3.6 的免費(fèi)發(fā)行版。當(dāng)我與一位該項(xiàng)目參與者交談時(shí),他們表示不打算在近期內(nèi)棄用 2.7 版本。

· 商業(yè) Python 發(fā)行版

除上述方案外,還有商業(yè)解決方案。其中之一是 Red Hat Enterprise Linux (RHEL)。如果你購(gòu)買了版本 8,直到 2024 年 6 月 Red Hat 將一直為你提供 Python 2 的支持服務(wù)。這就相當(dāng)于為你在 Python 2 上多買了 4 年的 bug 修復(fù)和更新,代價(jià)就是從免費(fèi)和開(kāi)源的編程語(yǔ)言轉(zhuǎn)換到讓人付費(fèi)使用他們發(fā)布的 Python。你也可以在網(wǎng)上找到其他 Python 2 付費(fèi)版本供應(yīng)商。

· 構(gòu)建自己的 CPython 2

如果你不想花錢請(qǐng)任何人來(lái)修復(fù) Python 2,你可以自己做。你需要做的是:衍生 CPython 存儲(chǔ)庫(kù),等待漏洞出現(xiàn),對(duì)它們進(jìn)行修補(bǔ),編譯自己的 CPython 版本,并在生產(chǎn)服務(wù)器上使用它。除非你清楚自己在做什么,否則這真的不是個(gè)好主意,因?yàn)檎l(shuí)都不希望在自己的服務(wù)器上引入漏洞。

項(xiàng)目遷移至 Python 3

如果以上選項(xiàng)都不適合你,那么你可能最終會(huì)還是會(huì)把項(xiàng)目遷移到 Python3。有兩種常見(jiàn)的方法可以做到這一點(diǎn):跨代碼或?qū)?Python 2 代碼重寫(xiě)為 Python 3。

· 跨代碼

跨行代碼的意思是同時(shí)使用 Python 2 和 Python 3 的代碼。這聽(tīng)起來(lái)像是要做更多的工作,因?yàn)槟阈枰瑫r(shí)支持兩個(gè)主要的 Python 版本,但是這樣會(huì)使轉(zhuǎn)換更容易—不會(huì)出現(xiàn) Python2 轉(zhuǎn)換到 Python3 過(guò)于突然的問(wèn)題。首先在 Python 3 下運(yùn)行測(cè)試(當(dāng)然,大多數(shù)測(cè)試都會(huì)失敗),然后不斷重寫(xiě)應(yīng)用程序的各個(gè)部分,直到它能夠在 Python 2 和 Python 3 上工作為止。接下來(lái)要在生產(chǎn)環(huán)境中更改 Python 版本,最后刪除 Python 2 代碼。此方法最大的好處是你可以在迭代中完成此工作。您可以在遷移系統(tǒng)各個(gè)部分的同時(shí)不斷為代碼添加新特性,這種方法也是客戶喜聞樂(lè)見(jiàn)的。

· 將 Python 2 重寫(xiě)為 Python 3

另一種選擇是用 Python3 重寫(xiě) Python2 的部分代碼。這個(gè)辦法輕松些,因?yàn)槟悴挥迷倏紤] Python 2。典型的辦法是將應(yīng)用程序的 Python2 版本保持在生產(chǎn)環(huán)境中,在一個(gè)單獨(dú)的 git 中使用 Python3 版本。然后你要不斷地測(cè)試新版本,當(dāng)它準(zhǔn)備好時(shí),你就可以放棄 Python 2,使用 Python 3 版本。如果有些程序還沒(méi)有測(cè)試就“滾”回到了 Python 2,那就太讓人崩潰了。需特別注意的是,這種方法意味著你需要暫停向應(yīng)用中添加新特性。

· 重新編寫(xiě)應(yīng)用

最后也是最困難的解決方案,用 Python 3 或你認(rèn)為最有效的任何其他編程語(yǔ)言從頭重寫(xiě)應(yīng)用程序。這種解決方案可謂“勞民傷財(cái)”,而且只有當(dāng) Python 2 版本只是一個(gè) prototype 時(shí)才有效。但它可以讓你完全重新設(shè)計(jì)你的項(xiàng)目,或許真的對(duì)你有用。

到底要不要遷移到 Python 3?

正如我一開(kāi)始說(shuō)的那樣,如果可以將項(xiàng)目遷移到 python3,那么趕緊做吧。Python3 不僅比 Python 2 快很多,而且它有更多優(yōu)秀的新特性,例如 asyncio、type hints、ordered dictionaries、f-strings 和更好的 Unicode 支持。風(fēng)云已起,開(kāi)發(fā)者還應(yīng)早作打算。

原文鏈接:You Don’t Have to Migrate to Python 3

標(biāo)簽: Python

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:人工智能和5G:進(jìn)入數(shù)據(jù)新世界

下一篇:智慧城市與智能城市還有數(shù)字城市有什么差別