Python-dev ML watch: 文字列リテラルに u プリフィックスがつきました。

更新が滞っているので、 Python-dev の ML の内容を伝える記事を気が向いた時に書くことにします。

Python 3.3a1 がリリースされましたが、その直後にコミットされたのが、文字列リテラルのu プリフィックスです。

この prefix は、 Python 2 と 3 に同一のコードで対応したい場合に利用します。文字列リテラルを書くときに、Python 2 でも 3 でも バイト列にするには b プリフィックスをつけ、 2 ではバイト列、 3 では unicode にする(PEP 333 では native string と呼ばれてる)場合はプリフィックスを付けなければ良いのですが、2 でも 3 でも unicode 文字列にできる文字列リテラルの書き方が存在していませんでした。

Python 2 と 3 の両方に対応しようとする場合、ひとつのソースコードで対応する方法、片方に対応したコードを変換してもう片方をサポートする方法、完全に fork してしまって両方メンテナンスする方法の3種類がありますが、最近 Web 系ではひとつのコードで対応する方法の採用が増えていて、u プリフィックスはそういった方法をとったライブラリやフレームワークPython 3 を後押しするために追加されました。

一方、 Python 3.2 が搭載された Ubuntu 12.04 LTS がもうすぐリリースされるなど、Python 3.2 は広く使われるバージョンになる予定になっているので、有名なライブラリやフレームワークPython 3.3 以降にしか対応しなくなると、ディストリビューション以外の Python をインストールしたくないユーザーに Python 自体が敬遠される可能性があるのではないかという懸念もありました。

しかし、シングルコードベースで開発されるプロジェクトを Ubuntu 12.04 LTS で使いたいなら、Python 2 版を利用すれば問題ありません。シングルコードベースを採用する利点は両方のバージョンを同じレベルでサポートするのが楽になるためなので、そういったプロジェクトでは Python 2 も長く利用されるはずですし、 u プリフィックスを一括で削除するだけで Python 3.2 で動くようにすることも簡単です。

ということで、今 Python 2 のコードを書くときは、 from __future__ import unicode_literal はせずに、unicode を書くときはプリフィックスをつけるようにしておくと、 Python 3 対応するときに楽になるかもしれません。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。