Author: Devin Jeanpierre <jeanpierr...@gmail.com> Branch: Changeset: r84181:75c1b672983d Date: 2016-05-03 16:19 -0700 http://bitbucket.org/pypy/pypy/changeset/75c1b672983d/
Log: Give better error messages for '%d' % 'not an int' (and %x, %o). Before: TypeError: unsupported operand type for long(): 'str' After: TypeError: %d format: a number is required, not str (same as CPython). diff --git a/pypy/objspace/std/formatting.py b/pypy/objspace/std/formatting.py --- a/pypy/objspace/std/formatting.py +++ b/pypy/objspace/std/formatting.py @@ -551,7 +551,15 @@ try: w_value = maybe_int(space, w_value) except OperationError: - w_value = space.long(w_value) + try: + w_value = space.long(w_value) + except OperationError as operr: + if operr.match(space, space.w_TypeError): + raise oefmt( + space.w_TypeError, + "%s format: a number is required, not %T", fmt, w_value) + else: + raise try: value = space.int_w(w_value) return fmt % (value,) diff --git a/pypy/objspace/std/test/test_bytesobject.py b/pypy/objspace/std/test/test_bytesobject.py --- a/pypy/objspace/std/test/test_bytesobject.py +++ b/pypy/objspace/std/test/test_bytesobject.py @@ -103,6 +103,12 @@ assert result == "a foo b" assert isinstance(result, cls) + def test_format_wrongtype(self): + for int_format in '%d', '%o', '%x': + exc_info = raises(TypeError, int_format.__mod__, '123') + expected = int_format + ' format: a number is required, not str' + assert str(exc_info.value) == expected + def test_split(self): assert "".split() == [] assert "".split('x') == [''] _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit