Python3.0仕様のrepr()が欲しかった


 Pythonは3.0で上位互換性を犠牲にして色々とすっきりしたらしい。ちょこっと見ると使いたくなる仕様ばかりだが、まあ、当面は2.5を使う必要があるので仕方ない。2.x系列も既に2.6が出て久しいっぽいけど。

 んで、とにかく読み込みの高速なシリアライズがしたかったのだが、Cライブラリは使えない環境であった。となると、一番高速なデシリアライザは何か。恐らくeval()だろう、素直に考えれば。入力元がAjaxとかだと大問題だが、そういうセキュリティ上の問題も今回は無い。
 であれば、eval()にそのまま渡せる文字列を生成してくれる組み込み関数repr()が最高に嬉しい、…はずなのだが。印刷不能な文字はエスケープされる仕様なんだけど、2.xだと大半が印刷不能という判定であった。つまり、日本語テキストとか全部エスケープされまくり。3.0から改善されたらしいのだが。うぬう。
 といっても、eval()に投げる分には問題は無く、単に人間が読めないだけなのだが、都合により人間も読みたいのだった。うぬーん。
 んで、仕方なくエンコード指定可能なrepr()もどきを自前で書いてみたら、あまりにも簡単に十数分くらいで出来て、動作的にも不満は無く、読み込みも超速かったのだが、どうももやもやするのであった。まあ、新版で解消されてるみたいだから文句を言う筋合いは無いし、古い環境を使わざるを得ない状況になっているのも仕方ない面はあるし…。早く3.0がもうバーンバーン使える世の中になるといいのにね!

 ちなみに自作repr()もどきは、ifを並べたくって、isinstanceとかで場合分けして、集合型はリスト内包の中から再帰させて、最後はelseの中にraise文、みたいなベタな奴だったけど、reprモジュールとやらを使えばさらに格段に簡単そうなことに後で気付いた。

 まあ、とにかく解決したからいいんじゃね。Pythonの練習にもなったし。

(Visited 50 times, 1 visits today)

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください