2011年7月30日 星期六

Python 2 to 3 的問題

看到有朋友在問 python 2 和 python 3 有何差距, 來寫一下自己的理解。先聲明, 我沒有實際轉過。

之前曾在別的地方讀到版本編號的含意, 忘了出處, 找了一下發現 RubyGems 的說明和我先前看到的內容一樣, 對版本 a.b.c 來說:

  • a 往上 +1, 表示有大幅改版, 會有不向下相容的部份, 官方 release note (或 changelog) 裡會描述那些地方沒有向下相容 (backwards incompatible changes), 如 Fabric 的 Changelog 有提到那些函式行為和之前不同。
  • b 往上 +1, 表示有曾加新 feature 或 bug fix, 但介面沒有改變, 可以安心昇級
  • c 只是修改實作方式, 對使用者來說, 行為完全沒變。

當然還有許多其它的表示方式, 就.....先忽略它們好了。說明這點是想強調 2 到 3 的難處, 在於有些不相容的改變。

《Case study: porting chardet to Python 3 - Dive Into Python 3》提供一個轉換的案例, 其中 Fixing What 2to3 Can’t 說明要手動修改的部份。

除了修改自己程式的問題外, 但是若別人的程式沒有升到 3, 改完也沒用。比方說大家都愛用的 NumPy, 官方說目前只支援 2.4 ~ 2.6, 像 SciPymatplotlib (強大的繪圖函式庫) 會用到 NumPy, 在 NumPy 升上去以前, 它們也無法升級。所以在重量級 packages 支援 python 3 以前, 一般使用者仍不方便升到 python 3。

2011-07-30 Updated

看到 Python 3 Wall of Shame 有統計各 package 被下載的次數以及是否支援 python 3, 才發覺原來 NumPy 已支援 Python 3 了

2011-07-31 Updated

WanCWEric Chen 提醒, 更新如下:
* 版號的定義是寫在 Semantic versioning
* matplotlib 已有官方的 Python3 branch

2011-08-02 Updated

Eric Chen 提醒, SciPy 也有支援 3.x

5 則留言:

  1. 文中提到的版本編號規則應該是 Semantic Versioning
    http://semver.org/

    回覆刪除
  2. SciPy已有Python3版本,matplotlib也有官方的Python3的branch了喔(https://github.com/matplotlib/matplotlib-py3)!

    回覆刪除
  3. 謝啦兩位, 已更新內文。

    @EricChen 我在 SciPy 官方下載頁面沒看到 python3, 請問一下消息來源的出處是?
    http://sourceforge.net/projects/scipy/files/scipy/0.9.0/

    回覆刪除
  4. http://sourceforge.net/projects/scipy/files/scipy/0.9.0/
    下方的README.txt中有寫喔!
    "This release requires Python 2.4 - 2.7 or 3.1 - and NumPy 1.5 or greater."

    回覆刪除

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...