Python で複数のバージョンをサポートするのがしんどい

すでに Python 3.1 もリリースされ、また 2.7 のリリースも近いというのに、世の中ではいまだ Python 2.3 や 2.4 が現役で使われている。

たとえば、サーバ用 OS としてよく使われる CentOS 5 では、Python のバージョンは 2.4 である。

またレンタルサーバxrea.com では、2.3 と 2.4 が半々ぐらい。2.5 はインストールすらされてない。

そんなわけで、Python のライブラリをリリースするなら、下は 2.3 や 2.4 から、上は 3.1 までサポートするのが望ましい。だけど、それをしようとすると Python はかなりめんどくさい。

たとえばデコレータやジェネレータ式やset()が導入されたのは 2.4 からなので、2.3 をサポートしようとすると使えない。

## デコレータやジェネレータ式は 2.4 以降
@classmethod
def f(cls, *args):
   print ", ".join(str(x) for x in args)

## 2.3 をサポートするにはこう書く必要がある
def f(cls, *args):
   print ", ".join([str(x) for x in args])
f = classmethod(f)

また try/except と try/finally が同じインデントで書けるようになったのは 2.5 から。あと条件演算子も 2.5 からだから、2.4 をサポートしたければ使えない。

## 2.5 では try/except/finally が同じインデントで書ける
f = open('file.txt')
try:
    s = f.read()
except Exception, ex:
    logging.error(ex.message)
finally:
    f.close()

## でも 2.4 をサポートしたければ、ネストしないといけない
f = open('file.txt')
try:
    try:
        s = f.read()
    except Exception, ex:
        logging.error(ex.message)
finally:
    f.close()

Python はバージョンアップごとに少しずつ改善されていっているのはわかるんだけど、なんというか、構文レベルの変更があるので複数のバージョンをサポートするのがしんどい。exceptとfinallyが同じレベルで書けるようになったのが 2.5 からとか、はぁ?とか思うんだよね。こういう基本的なところはもっと初期からサポートしておいてほしい。

ほかにも Exception クラスが new-style になったのが 2.6 からとか、今までなってなかったのかよ!と思う。new-style class の導入自体はもっと古くからされてるんだから、そんな変更は 2.3 や 2.4 のころで済ませといてほしい。2.6 で動かしたらテストがエラーになりまくって焦ったわ。

このへんは、まだ PHPRuby のほうがましだよね。Ruby の構文は 1.6 から特に大きな変更はないからサポートは楽だ (今さら 1.6 をサポートする必要はないけど)。条件演算子は昔から使えるし、begin/rescue/ensure はいつでも同じレベルで書けるし、クラス定義が new-style に変更されるなんてこともない。

人によって感じ方は違うだろうけど、Ruby は言語のコンセプトが最初からしっかりしている (ように思う) から、構文レベルの変更とか Object クラスの仕組みが変わるとかなくて、変わるのはライブラリのほうだけだから複数バージョンのサポートは別に難しくない。でも Python のように object レベルでの変更とか構文レベルの変更がちょくちょくあって、かつ古いバージョンも広く使われていたりすると、複数バージョンのサポートはかなりしんどい。

特に Python 2.x と 3.x の両サポートは泣きそう。構文レベルで互換性がないから、えらいトリッキーな書き方をしないといけない。かといって、2.x と 3.x とでソースを分けるのもメンテナンスが超めんどくさい。Ruby 1.8 と 1.9 の両サポートが簡単なのに比べると、どうしても、ね。

いつまで Python の古いバージョンをサポートしなきゃいけないのだろうか。少なくとも CentOS 5 はあと数年は現役で使われるだろうから、その間は 2.4 のサポートは必要だろう。また Google App Engine は 2.5.2 だから、App Engine ユーザは Python 3 への移行なんて当分できそうにない。Google がとっとと 3 に移行してくれないと、Python 3 が主力になることはないように思う。残念ながら。


そんなわけで、どなたか Snow Leopard で 2.4 や 2.5 をコンパイルする方法を教えてください。いろいろぐぐっても、さっぱり解決できへん。