Author: Daniel Patrick <danieljudepatr...@gmail.com> Branch: py3.5 Changeset: r87368:0bf6794a3933 Date: 2016-09-24 21:20 +0100 http://bitbucket.org/pypy/pypy/changeset/0bf6794a3933/
Log: Make error messages for dict and other non-numeric types consistent with CPython 3.5 diff --git a/pypy/objspace/std/floatobject.py b/pypy/objspace/std/floatobject.py --- a/pypy/objspace/std/floatobject.py +++ b/pypy/objspace/std/floatobject.py @@ -226,7 +226,8 @@ if e.match(space, space.w_TypeError): raise oefmt( space.w_TypeError, - "float() argument must be a string or a number") + "float() argument must be a string or a number,\ + not '{}'".format(type(space.unwrap(w_value)).__name__)) raise value = _string_to_float(space, w_value, value) w_obj = space.allocate_instance(W_FloatObject, w_floattype) diff --git a/pypy/objspace/std/test/test_floatobject.py b/pypy/objspace/std/test/test_floatobject.py --- a/pypy/objspace/std/test/test_floatobject.py +++ b/pypy/objspace/std/test/test_floatobject.py @@ -479,6 +479,45 @@ assert hash(-1.0) == -2 assert (-1.0).__hash__() == -2 + def test_float_from_dict(self): + try: + float({}) + except TypeError as e: + assert "not 'dict'" in str(e) + else: + assert False, 'did not raise' + + def test_non_numeric_input_types(self): + # Test possible non-numeric types for the argument x, including + # subclasses of the explicitly documented accepted types. + class CustomStr(str): pass + class CustomBytes(bytes): pass + class CustomByteArray(bytearray): pass + + factories = [ + bytes, + bytearray, + lambda b: CustomStr(b.decode()), + CustomBytes, + CustomByteArray, + memoryview, + ] + try: + from array import array + except ImportError: + pass + else: + factories.append(lambda b: array('B', b)) + + for f in factories: + x = f(b" 3.14 ") + assert float(x) == 3.14 + try: + float(f(b'A' * 0x10)) + except ValueError as e: + assert "could not convert" in str(e) + else: + assert False, 'did not raise' class AppTestFloatHex: spaceconfig = { diff --git a/rpython/rlib/rfloat.py b/rpython/rlib/rfloat.py --- a/rpython/rlib/rfloat.py +++ b/rpython/rlib/rfloat.py @@ -25,7 +25,7 @@ globals().update(rffi_platform.configure(CConfig)) -INVALID_MSG = "invalid literal for float()" +INVALID_MSG = "could not convert string to float" def string_to_float(s): """ _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit