IPython 6.0 新版本發布與總結

寫在前面:最近一個月趕論文急的要死,從3月15日到4月15日一個月的時間,做了之前從來都沒有做過和做到的事情,感覺還是收穫頗豐。初步有了快速閱讀英文文獻的能力,初步有了組織語言,寫一篇學術論文的想法。儘管著急上火的時候有種要吐血的衝動,但是現在作為一個過來人看這段經歷和收穫到的東西,對當初的吐血的感覺也沒有了特殊的感覺。

總之收穫到了一些東西,變強了一點點,就是不錯的。

本篇原文:Release of IPython 6.0 四月十九日Ipython官方博客上的新版本Ipython的發布宣言,核心表達了對Python3新語言特性的鐘愛和對Python2的拋棄卻不放棄。

休假了一周之後總覺得得做些什麼開始下一階段的學習,那麼大概就先做一篇翻譯來進行復健運動吧。

(作者寫文章很隨意,有些表達,真不如看原文。如有轉載,請註明譯者

Ipython 6.0 更新日誌

在5.0版本發布幾乎一年以後,今天我們非常榮幸地發布了Ipython 6.0 版本。使用python3.3版本以上的用戶可以向您的包管理者要求進行升級,以便使用這些新的特性。如果您使用pip的話:

首先請確保您的pip版本處於9以上:

pip --version

如果pip版本過低,請進行升級:

pip install pip --upgrade

之後,進行ipython的升級。

pip install ipython --upgrade

如果您安裝了conda:

conda update ipython

不同的conda源或許會在幾小時內或者幾天內更新ipython到最新版本。

新特性頁面中有更為詳細的改動介紹,其中包括新的特性、我們所做的修改以及過時的特性。

高亮特性: Jedi 補全

其中一個最大的變化為Jedi的集成,這使得我們能夠使用靜態分析來進行代碼補全,並且能夠顯示完整的類型。這將會為我們提供顯示更豐富的Tab補全內容(例如:其允許提取並且顯示完成器中函數的簽名)的基礎功能。而到目前為止,這些特性僅在命令行用戶處可用,但IPykernel以及多種前端(如nteract)中使用這些特性的相關的工作已經在逐步展開。

Python 2 版本的夕陽紅

正如我們在去年發布5.0時候講的那樣,Ipython 6.0以及後續的版本需要Python 3環境。而5.x分支現在仍然在維護並且會經常性地更新,因此Python 2的用戶會看到這些更新,但是IPython 6.x中的新特性就不會遷移回去了。

我們已經做了許多工作,盡量減小IPython在Python2 和Python3 中安裝的差異,但你仍然可能會發生一些錯誤。如果真的發生了一些錯誤,請參見Github上的readme部分。

如果你想了解更多關於Python2 謝幕版本的開發進程(seamless Python 2 sunset)並且準備參與PyCon2017的話,我們建議你參與我們的討論使用用戶友好的方式解決py2和py3之間兼容性的問題,周六,五月二十日下午15:15--16:00 PDT。

確保你有Pip9或者更高版本Pip

對於大多數終端用戶,你所要考慮的只有保證你的pip版本高於9。你可以輸下面的指令來檢查你的pip版本:

pip --version

如果你的pip版本過老,你得在升級ipython之前升級你的pip:

pip install pip --upgrade

Pip 9+版本會為你安裝最新的合適的ipython版本,這意味著使用Python2的話會為你安裝5.x版本的ipython,你若使用Python3則會為你安裝6.x版本的ipython。請務必確保這在你的所有python環境變數以及構建腳本中是一致的。而Ubuntu14.04 LTS版本的用戶需要注意,系統自帶的pip版本過於低,在進行ipython安裝時不會為你安裝正確的版本。不要忘記在你的不同安裝腳本、持續性集成以及docker image里更新pip。

Python 3 宣言

我們十分關注Python2 和 Python3之間的無縫共存問題。這就是我們進行僅支持Python3的新版本發布這一轉變的原因之一,而與此同時我們也會繼續進行更加適合Python2版本的5.x版本ipython的維護。如果你想要了解更多的原因,你可以在python3宣言這裡獲取更多的信息。

如我們所料,在我們從一個單一的源遷移到僅使用Python3的源的過程中發現了許多挑戰和陷阱。在克服這些債愛的過程中,我們學到了很多東西。我們已經將你可能產生的風險以及錯誤(以及解決方案)都寫成了文檔,在實用性部分,這也是Python3宣言中的一部分。

如果你是一個庫的維護者,並且你準備停止對一個舊的Python版本的支持(即使是一個子版本),並且你想要儘可能降低給仍然使用低版本Pyhton庫的用戶帶來的挫折,我們可以接受你的幫助。如果你想要加入我們,在這種新舊版本的轉換過程中來解決相關問題的話,請加入我們的Github討論。

純Python3支持的遷移

將IPython的代碼完全遷移到Python3版本並不是一個簡單的工作,並且是一個據我們所知的未知領域。但是開弓沒有回頭箭,並且希望能夠考慮到可能出現的絕大多數問題。有了這樣的前提,我們希望能夠讓其他想要步我們後塵的項目的轉換更加輕鬆。

首先,談談個人對於寫純的Python3代碼的經驗。

IPython的代碼庫相比於上一次更新已經降低了1500行。當然,這並不僅僅是因為移除了對Python2的支持,但是其中不可忽視的一點是的,是因為移除了對Python2的支持。而這種代碼量的減少是建立在增加新特性帶來的新的幾百行代碼基礎上的,因此更加具有象徵性意義。大量的條件都被去除了,這使得代碼更加簡單易讀並且更易於維護。閱讀代碼庫的時候我們可以看到,許多在代碼緊湊性上的改進也僅僅移除了部分實用函數,而這些函數僅為了提供兩個平台上一致的表現。儘管這樣,代碼庫中一部分代碼仍然受到Python2代碼的影響,因此遷移代碼所帶來的潛在收益更大。我們將會在前行過程中繼續我們的追求,來逐步消除舊時代遺風,並且像往常一樣,我們歡迎各位進行代碼貢獻。

這一變化減輕了代碼貢獻者在對IPython進行代碼貢獻時的負擔。貢獻者會花更少的時間考慮:「這在Python2中應當如何實現」,或者是由於在Python2中測試失敗而重新寫一次pull請求。與此同時,我們的測試目前在持續性集成服務上完成進度更快,因為他們需要運行的Python版本更少。

一組新的API使用了類型標註,這是Python3獨有的語法,適當的加以使用的話能夠使得代碼更加清晰並且易於重構,同時使得文檔能夠集中描述函數的使用和為何使用,而不是描述函數的類型。我們同樣能夠使用Python3中的一些優美的特性,像是純關鍵字的變數,而這在設計API時尤為有用。

從一個開發者的角度我們非常樂意有寫純Python3代碼的機會,並且我們期待有像pathlib一樣的更多的改進。

維持一個穩定的Python2分支

維持一個穩定的Python2分支的同時使其(Python3版本的代碼)安裝體驗儘可能符合Python2用戶的習慣是我們在進行純Python3環境遷移過程中要考慮的重點。我們的第一個問題是我們如何確定Python2的用戶在使用pip install命令時能夠獲取到適合他們的系統的Ipython最新的5.x版本(而不是不適合的最新的大於6.x版本Ipython)這使得我們打了一堆上游補丁程序(我們將在PyCon中做一個報告,來聽聽吧)和一些如何將這樣的轉換變得體驗更加相近的一些指導。我們給pip pypi-legacy, warehouse (我們必須學習postgres資料庫來完成這個)都打了補丁,同時改進了peps並且使用setuptools中最近的一些提升來使得Python用戶能夠和平地共存。用戶所需要做的僅僅是使用9版本以上的pip,然後使用pip install,以及pip install -e,而不是直接調用setup.py。

遷移更多的代碼到純Python3環境下

Ipython是我們維護的第一個從Python2+3混合狀態下遷移到純Python3環境下的Python包。一些我們最近的項目(例如JupyterHub)從一開始就僅在Python3下運行。我們期待更多的Jupyter和Ipython項目會遷移到純的Python3環境下。

由於Jupyter協議是一種語言無關的協議,所以使用運行在Python3環境中的Notebook伺服器來在Python2內核上運行Python2代碼是完全可能的。尤其是JupyterHub早已在純的Python3環境下運行,我們預計,單一用戶群的伺服器將會緊隨其後(譯者註:大概意思是之後大家都會用Python3下的Jupyter來作為Notebook的伺服器,反正能運行Py2和Py3的代碼)。

結論

我們希望你能夠享受這一版本。這將是一些其他牛逼的特性的基礎,像是async/await REPL。我們希望自從我們第一次發布純Python3版本之後我們的工作在python的Packaging生態系統中能夠最小化這些不可預料的暫時的困難。我們期待著你們的後續反饋。

Trans by Lawbda,edit in 2017.04.23 14:32


推薦閱讀:

Python利用嵌套函數二分搜索列表中大於等於m,小於等於n的數字
1000+收藏了!小白自學Python一本通
Python初學者好玩案例(二):聽兩個聊天機器人互相聊天(15行代碼)
如何用數學軟體畫一個「聖誕樹」?
P 站非會員查看人氣作品

TAG:IPython | JupyterNotebookIPythonNotebook | Python |