2014年9月9日火曜日

Rubyistが歩んでみる蛇の道はPython その3

Dive into Python 3のchapter 4をざっくり読んでみた。

Pythonは2から3で、文字列の扱いが大きく変わったそうな。具体的には、Unicodeで表現できる文字の並びをstringと、符号無し8ビットの値の並びをbytesを、明確に区別するようになった。

文字列の内部表現に関しては特に規定がなくて、UTF-8にするもUTF-32にするも実装の勝手なのかな。何であれ、Unicodeじゃない文字列を入力して文字列としてPythonで処理したければ、必ず文字コードの変換が入るわけだ。Rubyとの比較はるびまのM17Nの記事が良くまとまっているが、Rubyの場合は内部表現は統一していない。文字コードの変換とそれに関する問題から縁遠いのが長所だが、自分が処理系を実装するなら、面倒だからUTF-8あたりに統一するだろうなぁ。RubyはUnicodeと心中するつもりは無い、みたいなことをどこかで読んだような…。

話をPythonに戻すと、stringやbytesはimmutable。すなわち、stringやbytesのインスタンスは、何かを付け足したり削ったり、部分的に置き換えたりできない。

>>> s = 'abc'
>>> t = s
>>> s += 'def'
>>> s
'abcdef'
>>> t
'abc'
このように'abc'というインスタンスを'abcdef'に変更するわけではなく、あくまで'abcdef'というインスタンスを新たに生成するのだ。ただ、bytesに関してはmutableなbytearrayも存在するので、巨大なバイト列を扱うときなど、適宜bytearrayと使い分ければ良いのだろう。

formatは微妙。どうしてデファクトスタンダードであるCのprintfの書式を踏襲しなかったのか? 雰囲気はシェルスクリプトのpositional変数に似てるけど$記号は使わない。dictのキーとして文字列を指定するときに''で括らない等、文法的にも何となく気持ち悪い。

ソースの文字コードにUTF-8を推奨しているのはいいね。Shift_JISとCRLF改行のファイルを撒き散らすメモ帳は死ね。氏ねじゃなくて死ね。

0 件のコメント:

コメントを投稿