關於Python 3的一些想法

馬帥發表於2014-01-07

Python社群的朋友們、開發者們,我們需要談談了。2008年12月3日,Python 3.0 首次發行。當時人們普遍認為,距離Python3能真正被所有人廣泛使用,還需要一段很長的時間。當時大家的估計是五年。而現在距離當時,正好已經五年了。

從Python 3剛剛發行開始,到之後的數年間,我都一直在為Python 3的出現感到激動不已,並且不斷努力推廣Python 3的使用,還將我原來的專案遷移到Python 3之上。在過去的一兩年裡,我的每一個新專案,都是從一開始就使用到了Python 3 進行開發的。

可是大概六個月以前,我開始反思自己這樣做是否真的正確,並且漸漸地,我對Python 3 的激情變為了絕望。

在從Python2過度到Python3的最初幾年裡,大家都覺得只有幾個開源專案需要遷移而已。可是後來,需要遷移的專案就像潮水般地出現了。例如在Django中,要實現這樣的遷移,我們就需要一個新的WSGI的規範,還需要對資料庫驅動進行遷移,接下來我們才能進行遷移,再接下來,使用者們才能開始遷移。

目前為止,Django和大多數應用生態系統(app ecosystem),以及Numpy和其他科學生態系統(scientific ecosystem) 都能夠在Python3上執行了,Python3的幾個新版本也已經發行了,可是使用者們卻一直沒怎麼使用它們。

Python package index 的下載統計資料顯示,Python3的下載量在總下載量中所佔比例不到2%。更加糟糕的是,現在幾乎沒有用Python3寫出的程式碼。雖然我的所有新程式碼都支援Python3,但是我卻會locally將Python3和Python2程式碼一起執行、測試。只有Travis CI 幫我在Python3下執行程式碼。所以,我目前還沒有完全使用Python3寫成的程式碼。在一些使用Python作為程式碼庫語言的公司裡,我跟一些負責人員有過交流,我發現基本上沒有人在使用Python3,而且也沒人打算進行Python版本的遷移。

實際上,早在Python3.1發行時,許多人就都認為,使用者們會為了使用其中新特性和新標準庫而進行Python版本升級了(當然,現在的Python3.3 功能也十分的強大)。但是幾乎99%的使用者們都沒有使用這些新功能。所以當我們告訴使用者們,“Python3比Python2更加好用!”,我們實際上相當於什麼也沒說,因為Python3的這些新特性根本沒有幫到他們的忙。

除了上述的問題外,Python3的低使用率也非常不利於Python語言本身的發展,因為使用者與開發者之間的反饋機制幾乎不復存在了。現在,只有很少的人在使用Python3,並對其中新增加的特性給出反饋。而這樣少量的反饋可能根本無法代表大多數Python社群使用者的意見。在我們不斷髮行Python3.X的過程中,這一問題也變得越來越嚴重。現在我們仍在一些原有特性的基礎上增加新特性,但是在設計這些特性時,我們完全得不到它們在實際廣泛使用後反饋的指導。

為什麼那麼少人使用Python3呢?

首先,我認為是大家的緊迫感太少了。很多年前,在我還不會程式設計的時候,Python2還在發行的時候,開發者就已經決定要最終發行Python3了。現在回頭想想,這樣的決定無疑是錯誤的,因為整個Python社群因此滿足於使用Python2,並沒有升級到Python3的緊迫感。因為缺乏緊迫感,大家最後懶惰了起來。

其次,我認為還是因為Python3從根本上說就不足以使人激動不已。Python3裡並沒有人們特別希望出現的功能,比如去除被人廣為詬病的GIL或者更好地提高效能(也因為如此很多人在使用 PyPy)。相反,很多Python3加入的功能顯得多餘。例如,Python3增加了許多新標準庫(其中大部分基本可以通過pip install實現),而至於新增加的小型清理功能,很多經驗豐富的Python程式設計師因為習慣原因,一直努力避免使用它們。很明顯,還沒有人願意停下手中的開發,而去花時間進行版本升級,特別是現在看來Python2還能繼續使用一段時間。

那麼現在的情況如何呢?

顯然現在我們的處境並不好。首先,最重要的是,我們都要對Python3有更加清醒的認識。具體來說,就是我們要意識到,Python3已經發行數年了,但對大多數開發者而言,Python並沒有因此而變得更好。

Python2與Python3間的分歧對整個社群非常不利,我們必須設法將兩者結合起來。

對此我有一個建議:可以發行Python2.8版本,並在其中加入Python3的所有新特性。我們將刪除那些因為相容性原因而無法加入Python2.8中的特性,比如使用 str + unicode 時會提示警告,和其他一些不能支援 from __future__ import unicode_literals 語句的情況。我們必須能夠讓使用者在升級的過程中,保證語言使用的一致性。Python3就打破了這種一致性,而現在我們必須彌補這個過錯。

當然這僅僅是我個人的建議,問題最終的解決還需要大家提出更多辦法。我們必須要把Python2和3之間的分歧填補起來,這種分歧已經隨著每次Python3的發行而越來越大了。

感謝 Maciej Fijalkowski 和其他人對這篇文章的校對。

譯註:英文原文中 200 多條評論,推薦 Python 程式設計師 可以去看看。

相關文章