Pythonでコード書いてると、1回は残念だなぁと思うポイントとして表題の件があると思います。具体的には以下です。
# リストも辞書も出力がお世辞にも良いとは言えない。。 >>> print ['あ', 'い', 'う'] ['\xe3\x81\x82', '\xe3\x81\x84', '\xe3\x81\x86'] >>> print {'title':'ねじまき鳥', 'author':'村上春樹'} {'author': '\xe6\x9d\x91\xe4\xb8\x8a\xe6\x98\xa5\xe6\xa8\xb9', 'title': '\xe3\x81\xad\xe3\x81\x98\xe3\x81\xbe\xe3\x81\x8d\xe9\xb3\xa5'}
日本語がバイト表現な上、全要素が1行で表示されています。これではちょっとprintデバッグするにも萎えますよね。複雑な辞書を出力した場合なんかは、出力された文字列の整形にかなりのパワーを裂かれること請け合いです。
前々から何とかならないかと、悶々とした日々を過ごしていたのですが、先ほど駄目元で以下のコードを試してみたところ無事pretty printに成功しました。一旦json形式にした文字列を、evalでunicode文字列として再評価しています。そうする事でエスケープ表記されたunicode文字からunicodeオブジェクトを作っています。無理矢理感は否めませんが、背に腹は代えられないでしょう!
#!/usr/bin/python # -*- coding: utf-8 -*- import simplejson as json def pp(obj): if isinstance(obj, list) or isinstance(obj, dict): orig = json.dumps(obj, indent=4) print eval("u'''%s'''" % orig).encode('utf-8') else: print obj
これで例えば以下の様な出力が得られます。これで安心してリストと辞書を使えるようになりました。
>>> pp(['あ', 'い', 'う']) [ "あ", "い", "う" ] >>> pp({'title':'ねじまき鳥', 'author':'村上春樹'}) { "author": "村上春樹", "title": "ねじまき鳥" }
たった4行ですが、達成感があります:) なので今は凄く良い気になっているのですが、常識かもっといい方法があったら恥ずかしいので教えて下さい。
2010.3.8 追記
個人的には割と使用頻度が高いので、prettyprintモジュールにしてpypiに登録しました。インストールはeasy_installから。ソースはgithubから。
$ easy_install prettyprint
出力するppメソッドと、整形文字列を返すpp_strが定義されただけの酷く簡単なモジュールです。
from prettyprint import pp, pp_str target = {'order':'綺麗に表示せよ'} pp(target) print pp_str(target)


[...] http://taichino.com/programming/1599 素晴らしす。 pypiに登録してくれているので、pipで一発インストール可。 [...]