Python 之父Guido van Rossum在2013年對幾個問題的回應
摘要:
關於Python面向對象的問題。
關於PyPy
關於瀏覽器運行Python
關於Python 3
關於函數是編程問題
關於lambda表達式問題
關於面向對象:介面,虛類,私有成員,等等…為什麼Python沒有這些特性?
Guido:我能想到的有兩個原因:你並不是真的需要它們,並且如果沒有編譯時的類型檢查會很難實現。
Python是作為一個臭鼬工廠的項目開始做的(沒有被管理層支持和鼓勵但也沒有阻止),並且我希望能夠快點出一些成果。這指引我移除了一些不是真正需要或者繼續的特性;這也讓我進行運行時的所有類型檢查,它限制了Python能夠支持的特性。
我也不是面向對象的忠實信徒——我只是想要一個簡單的語言,它因為意外或多或少地變得有一些面向對象。
在新版的Python中,已經有了和這些語言特性類似的實現,但運行效果並不怎麼好,或者導致大量的運行開銷,所以,這些特性通常是需要避免使用的(不過,這些特性還是有一些用處,有些人也熱衷去使用它們)。
你覺得PyPy代表未來的發展方向嗎?
Guido:我對此仍然持懷疑態度,有兩個原因:
(1)它們還不支持Python3。
(2)還有很多擴展模塊不能很好的支持。
但是我希望它們能修復那些問題。
作為PyPy項目的競爭者,Jython和IronPython會讓CPython項目保持其發展勢頭(咋又回到CPython了呢^_^)。
是不是已經是時候來實現讓Python運行在瀏覽器里的功能了?
Guido:我在1995年就放棄了這件事。並且請不要把Python編譯成Javascript。它們的語義非常不同,結果是你用Javascript寫了一個Python運行時,它會讓運行變得太慢。
關於Python3:
Guido:我同意向Python3的遷移會持續很長時間,在我離開Google的時候,所有向Python2.7過渡的工作全部完成了(在前幾年已經成功的從2.4遷移到2.6),在Dropbox這裡,客戶端和伺服器端都是用的2.7。這兩個公司都在考慮Python3的問題了。
再來說向Python3的遷移,我實際上是相當樂觀的。很多流行的庫都開始著手做這件事。它確實會持續很長時間,但也有很多進展,過幾年之後,我希望所有的代碼都能遷移到Python3上來。完全根除Python2的使用可能會花更多的時間,但是呢,Windows XP不也是沒完全死掉嗎。
你是否感覺函數式編程方法總的來說不是特別有用,或者它不是十分適合Python?
Guido:我並不是把一個想法做到極致的信徒,我試著在設計選擇的時候走實用主義的路子(但不是「太」實用主義)。我會衡量現實代碼的可讀性和可用性。有些地方 map( ) 和 filter( ) 是適合的,但是另一方面Python有列表推導。我不再討厭 reduce( ),因為我曾經只用 (a) 來實現sum( ),或者用(b) 可讀性不好。所以我們添加了內建的sum( ),將reduce( )移除出內建函數,移到了一個工具函數里。
我對函數式語言的看法,就是它們都用非常強大的編譯器,比如Haskell。對這樣的一個編譯器,函數式泛型是非常有用的,因為它讓大量的轉變成為可能,包括並行化。
但是,Python解釋器並不清楚你的代碼的含義,這也是很有用的。所以,我不認為把一些函數式的思想加入Python是合理的,因為這些在函數式語言里是很有用的,但是不適合Python,並且這會讓代碼對不使用函數式編程的人非常不具有可讀性(這裡指的是大部分程序員)。
我也不認為現在函數式語言的成果已經讓它準備好成為主流。不可否認的是,我對於Haskell一些相關的領域並不是很了解,但是任何沒有Haskell流行的語言都有它的實際用處,我也沒有聽過有別的函數式語言比Haskell更流行。對於Haskell,我認為讓很多編譯器技術得到證明是非常棒的,但是它的「純凈」會是它被人接受的最大障礙。它的單一讓它對於大部分人是不適合的。
Python有限的支持lambda表達式,是否會支持多行lambda表達式?
Guido:這確實是更好的方法,這裡使用def關鍵字在本地作用域定義一個正規的函數。這個被定義的函數對象變成了一個本地變數,而這根使用lambda是相同的語義,除非這裡用到了一個本地變數,並且這裡沒有任何語法的限制。例如,以下兩種寫法的語言是相同的:
def make_adder(n):
__def adder(x):
____return x + n
__return adder
然後這是使用lambda的表達式:
def make_adder(n):
__return lambda x: x + n
Andrew Koenig 有一次向我指出了在一種場景下,lambda是非常適合的,那就是你有你個很長的list或者dict包括很多lambda表達式,因此如果你想不用lambda實現的話,那麼定義一大堆函數,給它們命名,然後用list或dict里的名稱來引用它們就會讓你受不了。但是,在那種情況下,lambda表達式是足夠簡單的,如果你有一些異常,在list或dict之前使用def才是一種好的妥協。


※偽·從零開始學Python-1.1 認識Python
※大話Python爬蟲的基本套路
TAG:Python |