Python 例外のひどい仕様
Pythonの例外オブジェクトは苦手です。例外のメッセージが何でもASCIIとして扱われることがひどい。
In [1]: t = ValueError("テスト".decode("utf8"))
In [2]: print t
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
/home/ian/src/project/<ipython console> in <module>()
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
In [3]: t = ValueError(u"テスト") # Unicode objects don't work either
In [4]: print t
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
/home/ian/src/project/<ipython console> in <module>()
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
Djangoのテストフレームワークで、doctestを使おうと思ったら、例外のメッセージがASCIIじゃないとダメというのが判明
u"""
>>> test(-1)
Traceback (most recent call last):
...
ValueError: エラーですよ!
"""
とやっても、うまくうごかない。以下のUnicodeDecodeErrorがでる
======================================================================
ERROR: Doctest: app.tests
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/ian/.virtualenvs/test/lib/python2.5/site-packages/django/test/_doctest.py", line 2175, in runTest
test, out=new.write, clear_globs=False)
File "/home/ian/.virtualenvs/test/lib/python2.5/site-packages/django/test/_doctest.py", line 1403, in run
return self.__run(test, compileflags, out)
File "/home/ian/.virtualenvs/test/lib/python2.5/site-packages/django/test/_doctest.py", line 1291, in __run
got += _exception_traceback(exc_info)
File "/home/ian/.virtualenvs/test/lib/python2.5/site-packages/django/test/_doctest.py", line 269, in _exception_traceback
return excout.getvalue()
File "/usr/lib/python2.5/StringIO.py", line 270, in getvalue
self.buf += ''.join(self.buflist)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 24: ordinal not in range(128)
---
Update: moriyoshiさんにより、Python 2.6 でちゃんと動くみたい