你打算什麼時候轉到Python3?
最近把Mac上的默認Python換成了3.5,如果將來需要用僅支持Python2的模塊,打算通過新建虛擬環境解決。而在此前主要用的是2.7。切換版本的起因是看到Django會在2020年之後停止支持Python2的消息,這才知道2020年也是Python2官方停止支持的時間點。以前就讀到過一篇講轉移到Python3的文章,當時公司集群和流程默認都用的2.7,沒把這個太當回事兒。如今一晃兩三年過去了,Python3已經走到了3.6。這兩天讀了官網和一些Python核心開發者的文章,把一些感想記錄下來。
為何應該轉到Python3
- 2020年後Python2不會再有官方的安全更新發布,意味著這之後Python2不再有官方的維護;
- Redhat、Fedora等Linux發行版之後默認安裝Python3(現在一般是兩個版本都有,以後可能會不再提供2),意味著那之後再想使用Python2,需要自己安裝。
- 諸如Django這樣廣泛使用的編程框架,開始追隨Python的更新步伐,在新版(1.11)中放棄對Python2的支持(目前BioPython是兩個都支持,還沒看到停止支持2的時間表)。
上面提的都是更新的推力,使用Python3的吸引力是什麼呢?沒錯,是3.x中的語言特性。直到不久前,我對3.x的印象還停留在對unicode支持和print改為函數上面。
Python3早在2008年就推出了,經過8年多的發展,引入的新特性遠不止這些。這裡只列舉幾個看到的印象最深的例子。#矩陣相乘運算符:@nS = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)nn#解包na, b, *rest = [1, 2, 3, 4, 5]nrestn# [3, 4, 5]nn#函數注釋ndef greeting(name: str) -> str:nreturn Hello + namen
第一眼看到這個函數注釋的語言,著實受了一驚:函數定義還能這樣,還是我熟悉的Python嗎?這種寫法和C/Java/Go等靜態語言的函數定義有些類似,只不過這裡的參數類型寫在後面。需要說明的是,這個僅是注釋,運行時並不會自動校驗參數和返回值是否合法,所以和編譯語言還是不同的,但這樣做的好處,就是可以省去在函數的docstring里聲明參數和返回值類型,參數類型一目了然,這就是所謂的」self documented code」。有關3.5的更多特性,可以參看官方文檔。
可能面臨的障礙
平台環境限制:比如你用的伺服器上默認還是2.6。
這個容易克服。需要用3.x,可以下載自己編譯,或者使用conda,關於conda如何使用,可參考之前介紹conda的文章,用它安裝Python或R/Perl的包也很方便。
正在用的模塊不支持Python3怎麼辦?
有沒有其他類似功能且支持3.x的模塊?或者自己嘗試將它移植到Python3,官方就有提供2到3的自動轉換工具,除去個別程序調用C擴展的特殊情況外,移植過程通常不難。
參考:
Why you should move to Python 3 – nowo Python 3 and Back Again: Is It Worth the Switch?題圖:Josh Jones
http://weixin.qq.com/r/tETI0BDESU02rVSz9xGm (二維碼自動識別)
推薦閱讀: