Dec. 20, 2013
我前陣子在 Facebook 發了一個動態
然後 Tim Hsu 就在下面留言表示想聽 six 的東西。six 是個好東西(很重要所以再說一遍),我不排斥分享一些心得,不過一來 six 很短,二來要準備 talk 很麻煩,三來沒什麼機會可以講,四來可能也沒有太多人想聽我講話,所以最後決定不如更新一下好久沒動的 blog。
可是還有一個問題:six 很短。如果光講它,這篇文章會沒什麼內容。所以不如就把主題定得廣一點,也會對比較多人有用。:)
Python 3 很棒。Python 3 是 Guido 的真愛。可是大家還是死守 Python 2.7,最後的 Python 2 堡壘——為了第三方套件。「第三方套件無法支援」應該是絕大多數人無法順利轉移至 Python 3 的原因;直到現在,仍然有很多受歡迎的套件不支援 Python 3,包括:
可是 Python 3 真的很棒!它終於解決了惱人的 Unicode 問題,大幅度修正命名慣例不一致的問題,更去除了一些原本因為向後相容性而存在的潛在問題。而且,雖然 Python 2.7 擁有「延長維護期」特權,總有一天官方還是會放棄支援。與其到時候再大幅改寫我們的程式,不如及早開始「向前相容」。
這篇文章的目的,就是要讓你可以寫出同時能在 Python 2 與 Python 3 順利執行的程式。你還是可以使用 Python 2 直譯器,所以不會有第三方套件不支援的煩惱;可是你會寫出完全合法的 Python 3 程式碼,所以也不必煩惱未來會不會需要額外維護!
首先,我們得先整理一下 Python 3 究竟有什麼與 Python 2 不相容的地方。Guido 在 2009 的文章中有詳盡的整理。我把主要的項目列在下面:
file
內建型別被移至 io
module 內(並改名)。list
的內建函式/方法改成回傳 iterator(官方的名稱是 view)。True
、False
與 None
成為保留字元。as
關鍵字(例如 except TypeError as e
;舊寫法是 except TypeError e
)。0o10
而非 010
(語法錯誤)。//
,原本的 /
運算子會自動轉型至浮點數。print
成為函式,而非 statement。str
等同 Python 2 的 unicode
;原本的 str
改名 bytes
。basestring
被移除。long
內建型別消失,統一為 int
且無上限值(與原本 long
的行為相同)。sys.maxint
常數移除。大概可以把這些項目分成三類:
所以以上所有的項目其實都有解!在下一篇文章中,我會把上面的項目走過一遍,說明要怎麼寫,才能同時符合 Python 2 與 Python 3 的語法。