伯樂線上導讀:Python之父Guido van Rossum在2013年1月正式從Google離職後並正式加入 Dropbox。2013年8月19日,Slashdot 網站發起了一個對 Guido 的訪談主題帖,網友在評論中提問。8月25日,Slashdot 在另外一個帖子中彙總了“物件導向、函數語言程式設計、PyPy、Python 3”等問題和回覆。該彙總帖現已由 賤聖OMG 翻譯成中文。(如果其他朋友也有不錯的原創或譯文,可以嘗試提交到伯樂線上。)
從Google到Dropbox
nurhussein 提問:“Hi,是什麼促使離開Google去Dropbox的?你之前在Google主要做什麼?以後在Dropbox會做什麼?”
Guido:在Google呆了7年之後,我已經準備好生活裡有一些變化,而這時Dropbox的工作機會正好契合了我的想法。以較高的層次來看,我的工作仍然沒有什麼變化:
- 花費一半時間來做作為Python的BDFL需要做的事情
- 在公司裡作為一名普通的工程師(不是一名經理或者團隊領導者)
- 做什麼程式碼審查,架構和設計工作
- 處理很多email
- 用Python來完成我的很多工作
一些細節當然是不同的。我在Google只做了兩件事:最開始的兩年我從事線上程式碼審查工具Mondrian的開發。這個工具從來沒有被開源,但是它促使了 Rietveld 的產生,它被Python,Go和Chromium 社群使用。在我加入Google App Engine後,我做了很多不同的事情,大部分是Python方面的事情。我Python的最後一個大專案是一個新的Python資料庫API,NDB。
我已經來Dropbox7個月了,我在這主要的工作是設計Dropbox資料儲存API。用到這個詞來描述這個資料儲存有點諷刺,但是不是我的錯——Dropbox資料儲存和Google App Engine資料儲存有一點重疊。
更諷刺的是,即使我做了如此多的設計工作,用Python完成了兩個原型,但是我們上個月釋出的SDK裡面只支援Java,Object-C和JavaScript。不過我正在完善它,這次採訪拖累了我的進度。
為什麼Python避開了一些常見的物件導向風格
由 i_ate_god 提問:“介面,虛類,私有成員,等等…為什麼Python沒有這些特性”
Guido:我能想到的有兩個原因:你並不是真的需要它們,並且如果沒有編譯時的型別檢查會很難實現。Python是作為一個臭鼬工廠的專案開始做的(沒有被管理層支援和鼓勵但也沒有阻止),並且我希望能夠快點出一些成果。這指引我移除了一些不是真正需要或者繼續的特性;這也讓我進行執行時的所有型別檢查,它限制了Python能夠支援的特性。我也不是物件導向的忠實信徒——我只是想要一個簡單的語言,它因為意外或多或少地變得有一些物件導向。
在現代的Python中,已經有了和這些語言特性類似的實現,但執行效果並不怎麼好,或者導致大量的執行開銷,所以,這些特性通常是需要避免使用的(不過,這些特性還是有一些用處,有些人也熱衷去使用它們)。
函式式語言
由 ebno-10db 提問:“有些人提出,Python是,至少一部分,是一種函式式語言。你不同意,我也是。只是有一些map和filter型別函式並不會讓它成為函式式語言。以我的理解,這些函式是被一些思念list的人加到庫裡的,並且你已經嘗試了幾次去掉它們。總的來說,你不是一個函數語言程式設計的粉絲,至少從Python上來看不是。
問題:你是否感覺函數語言程式設計方法總的來說不是特別有用,或者它不是十分適合Python?很希望聽到你不同方面的原因。”
Guido:我並不是把一個想法做到極致的信徒,我試著在設計選擇的時候走實用主義的路子(但不是“太”實用主義)。我會衡量現實程式碼的可讀性和可用性。有些地方 map( ) 和 filter( ) 是適合的,但是另一方面Python有列表推導。我不再討厭 reduce( ),因為我曾經只用 (a) 來實現sum( ),或者用(b) 可讀性不好。所以我們新增了內建的sum( ),將reduce( )移除出內建函式,移到了一個工具函式裡。
我對函式式語言的看法,就是它們都用非常強大的編譯器,比如Haskell。對這樣的一個編譯器,函式式泛型是非常有用的,因為它讓大量的轉變成為可能,包括並行化。但是Python直譯器並不清楚你的程式碼的含義,這也是很有用的。所以,我不認為把一下函式式的思想加入Python是合理的,因為這些在函式式語言裡是很有用的,但是不適合Python,並且這會讓程式碼對不使用函數語言程式設計的人非常不具有可讀性(這裡指的是大部分程式設計師)。
我也不認為現在函式式語言的成果已經讓它準備好成為主流。不可否認的是,我對於Haskell一些相關的領域並不是很瞭解,但是任何沒有Haskell流行的語言都有它的實際用處,我也沒有聽過有別的函式式語言比Haskell更流行。對於Haskell,我認為讓很多編譯器技術得到證明是非常棒的,但是它的“純淨”會是它被人接受的最大障礙。它的單一讓它對於大部分人是不適合的。
多行lambda表示式
由 NeverWorker1 提問:“對於Python,有一個最常見的抱怨就是它的對於lambda表示式的限制,也就是說一行裡不能賦值。很明顯,Python對空格的處理是導致這樣的主要原因。我已經花了一些事件思考實現多行lambda表示式的可能性,然後我能想出的最好方法是硬塞進一些不用的符號,比如C語言風格的大括號,這樣最多有點亂。有沒有更好的方法,你覺得這個功能會被新增上嗎?”
Guido:真的?我基本上從來沒聽到過那些抱怨,除了在Slashdot採訪裡提問題的人。
這確實是更好的方法,這裡使用def關鍵字在本地作用域定義一個正規的函式。這個被定義的函式物件變成了一個本地變數,而這根使用lambda是相同的語義,除非這裡用到了一個本地變數,並且這裡沒有任何語法的限制。例如,以下兩種寫法的語言是相同的:
1 2 3 4 |
def make_adder(n): __def adder(x): ____return x + n __return adder |
然後這是使用lambda的表示式:
1 2 |
def make_adder(n): __return lambda x: x + n |
Andrew Koenig 有一次向我指出了在一種場景下,lambda是非常適合的,那就是你有你個很長的list或者dict包括很多lambda表示式,因此如果你想不用lambda實現的話,那麼定義一大堆函式,給它們命名,然後用list或dict裡的名稱來引用它們就會讓你受不了。但是,在那種情況下,lambda表示式是足夠簡單的,如果你有一些異常,在list或dict之前使用def才是一種好的妥協。
PyPy
由Btrot69提問:“你覺得PyPy代表未來的發展方向嗎?你是否對此表示懷疑?如果是,為什麼?”
Guido:我對此仍然持懷疑態度,有兩個原因:(1)它們還不支援Python3。(2)還有很多擴充套件模組不能很好的支援。但是我希望它們能修復那些問題。作為PyPy專案的競爭者,Jython和IronPython會讓CPython專案保持其發展勢頭。
瀏覽器執行Python?
多年以來,曾經嘗試幾次建立一個沙箱版本的Python,使之能夠執行在瀏覽器上。主要是因為Javascript的問題。而現在針對Javascript做的工作,我們有了一個很好的替代品CoffeeScript——那現在是不是已經是時候來實現讓Python執行在瀏覽器裡的功能了?
Guido:我在1995年就放棄了這件事。並且請不要把Python編譯成Javascript。它們的語義非常不同,結果是你用Javascript寫了一個Python執行時,它會讓執行變得太慢。
Python3
由 MetalliQaZ 提問:“你對目前向Python 3的遷移的遷移感覺怎麼樣?從一個使用者的角度來看,一些流行的庫的轉變還差得很遠,而這阻礙著這種過渡。在我的專業所及的地方,基本上我用的所有系統都沒有安裝3.x直譯器。事實上,2.7也很少,我想聽聽你的看法。”
Guido:很好奇你在哪工作。我同意向Python3的遷移會持續很長時間,但是如果你的系統還沒用上2.7版本的話,那就真是有點古老了!在我離開Google的時候,所有向Python2.7過渡的工作全部完成了(在前幾年已經成功的從2.4遷移到2.6),在Dropbox這裡,客戶端和伺服器端都是用的2.7。這兩個公司都在考慮Python3的問題了。
再來說向Python3的遷移,我實際上是相當樂觀的。很多流行的庫都開始著手做這件事。它確實會持續很長時間,但也有很多進展,過幾年之後,我希望所有的程式碼都能遷移到Python3上來。完全根除Python2的使用可能會花更多的時間,但是呢,Windows XP不也是沒完全死掉嗎。