為什麼 Python 3.0 設計成不與 Python 2.X 兼容?主要有哪些地方需要突破才導致這一決定?


  • 字元編碼問題,直接用 unicode 統一可以一勞永逸,但是無法向後兼容;
  • 命名混亂問題(這個別和 PHP 比)和標準庫包的放置位置不合理問題(歷史原因,因為標準庫是逐漸擴張的),要改名字、改位置,也是最佳但不向後兼容的方案;
  • new-style class 和 old-style class 不統一問題,想徹底用 new-style class 取代之,但是也會帶來向後兼容問題。

這些問題都是歷史積累而來的,但是都要以放棄向後兼容為代價才能得以解決。而把它們看成遲早要解決的問題的話,當然不能在 2.6 - 2.7 的時候去解決,而是趁著大 版本號的更新(py3k)來解決,而且這樣可以同時維持 py 2 和 py3k 兩個分支,便於開發者的過渡。

其實 Python 過渡的還算很緩和的了,變更方面以改名字(PEP08)為主,所以用 2to3 工具甚至都能完成自動化遷移。


我覺得兼容就只能增加功能不能減少

只能放鬆約束不能更收緊規範

perl的理念是自由

你可以用任何你喜歡的方法達到目的

即使是這樣 社區還是受不了了

於是perl6也沒兼容5

python的理念本來就是優雅簡潔

有時候發現以前走錯了路

想糾正 只有不再兼容它了

長痛 不如短痛

當然這個短痛不如想像中短

已經那麼多年了...

不過python3的時代馬上就要來臨了!


Guido(Python之父,仁慈的獨裁者)在設計 Python3 的過程中,受一篇文章 「Python warts」 的影響,決定不向後兼容,否則無法修復大多數缺陷----摘自《流暢的Python》

後來我找到了這篇文章:

http://web.archive.org/web/20031002184114/www.amk.ca/python/writing/warts.html

不向後兼容對語言的發明者來說是沒有了包袱,誰都不喜歡帶著鐐銬跳舞,但對開發者來說是極不友好的。

你肯定沒聽說過學 Java 還要糾結是學 JDK6 還是 JDK7,也沒聽說學 PHP 糾結是學 PHP5 還是 PHP7,但在 Python 社區,有這麼個怪現象:「學 Python 到底是學 2 還是學 3?」

過來人都會教導新手小白,Python2和Python3是一門語言,沒必要糾結學哪個,當然,我經常跟他們說直接學Python3,可是,網上很多教程、博客文章都是基於Python2寫的,這就為難初學者了。

你說到底是學2還是學3,現在答案是:兩個都學

兩者的區別可參考來源:http://mp.weixin.qq.com/s/RJV57Og-ZVcIKllzEaMqtA


同意@王瑞華的答案。

個人感覺若是一直要向後兼容,就必須持續不斷地添加兼容性代碼,源碼就會因此變得非常臃腫,這明顯是有悖於 Zen of Python 的。一直向後兼容,就好像一張又一張狗皮膏藥,不論是維護還是更新起來都很難受,有種拖泥帶水的感覺。

Python原本的定位就是非常高級的語言。事實上,很多簡單的Python程序原原本本讀出來常人都能聽懂。明白這個之後,再想想像是xrange這樣的名字,明顯是比較晦澀、不那麼易懂的。這就是一個之前走過的錯路的例子。要是想要兩者兼顧,那肯定會出現xrange和range混用的情況,那樣豈不是更加混亂難懂?

正如同@王瑞華所說的「長痛不如短痛」。沒錯,Python3的不向後兼容這一特性的確令人詬病,我自己也常常因為這個而煩惱。但若是不向後兼容,Python的發展可能會被嚴重限制,或者會遠離初衷,變成一門語法混亂不堪的語言。


幾年前我就關注問題了,當時人語曰:"只要Django支持了Python3,Python3就會成為主流"。而現在,Django支持了Python3,Tornado也支持,NumPy那一乾等也是支持的,但是Python3怎麼還在徘徊呢? 這不科學啊。難道是慣性?


推薦閱讀:

怎樣才叫 「精通」 C語言?
有沒有合適的學習路線來學習封裝在IDE下的原理?
如何開發中文演算法?
各種常見的編程語言最廣泛應用的領域分別是什麼?
為什麼C++不能返回數組?

TAG:編程語言 | Python | Python3x | 編程理論 |