Author: Antonio Cuni <anto.c...@gmail.com> Branch: py3k Changeset: r56536:81cd817ffe62 Date: 2012-08-02 18:10 +0200 http://bitbucket.org/pypy/pypy/changeset/81cd817ffe62/
Log: add the possibility to have unicode error messages with operrfmt diff --git a/pypy/interpreter/error.py b/pypy/interpreter/error.py --- a/pypy/interpreter/error.py +++ b/pypy/interpreter/error.py @@ -320,10 +320,12 @@ return tuple(parts), tuple(formats) def get_operrcls2(valuefmt): + is_unicode = isinstance(valuefmt, unicode) strings, formats = decompose_valuefmt(valuefmt) + key = (is_unicode, formats) assert len(strings) == len(formats) + 1 try: - OpErrFmt = _fmtcache2[formats] + OpErrFmt = _fmtcache2[key] except KeyError: from pypy.rlib.unroll import unrolling_iterable attrs = ['x%d' % i for i in range(len(formats))] @@ -345,11 +347,17 @@ string = self.xstrings[i] value = getattr(self, attr) lst[i+i] = string - lst[i+i+1] = str(value) + if is_unicode: + lst[i+i+1] = unicode(value) + else: + lst[i+i+1] = str(value) lst[-1] = self.xstrings[-1] - return ''.join(lst) + if is_unicode: + return u''.join(lst) + else: + return ''.join(lst) # - _fmtcache2[formats] = OpErrFmt + _fmtcache2[key] = OpErrFmt return OpErrFmt, strings def get_operationerr_class(valuefmt): diff --git a/pypy/interpreter/test/test_error.py b/pypy/interpreter/test/test_error.py --- a/pypy/interpreter/test/test_error.py +++ b/pypy/interpreter/test/test_error.py @@ -1,3 +1,4 @@ +# -*- encoding: utf-8 -*- import py, os, errno from pypy.interpreter.error import OperationError, operationerrfmt from pypy.interpreter.error import decompose_valuefmt, get_operrcls2 @@ -33,6 +34,13 @@ operr3 = operationerrfmt("w_type2", "a %s b %s c", "bar", "4b") assert operr3.__class__ is not operr.__class__ +def test_operationerrfmt_unicode(): + operr = operationerrfmt("w_type", u"abc %s def %d", u"àèì", 42) + assert isinstance(operr, OperationError) + assert operr.w_type == "w_type" + assert operr._w_value is None + assert operr._compute_value() == u"abc àèì def 42" + def test_operationerrfmt_empty(): py.test.raises(AssertionError, operationerrfmt, "w_type", "foobar") _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit