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 object's 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 でちゃんと動くみたい
