From: Mark Dickinson Date: Sat, 3 Sep 2016 16:45:00 +0000 (+0100) Subject: Issue #27934: Use float.__repr__ instead of plain repr when JSON-encoding an instance... X-Git-Tag: v2.7.13rc1~186 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e6239a3ab3e009a1b15918c1b8182290bb8a2e91;p=python Issue #27934: Use float.__repr__ instead of plain repr when JSON-encoding an instance of a float subclass. Thanks Eddie James. --- diff --git a/Lib/json/encoder.py b/Lib/json/encoder.py index f5eeed75f0..97ffe8e8a2 100644 --- a/Lib/json/encoder.py +++ b/Lib/json/encoder.py @@ -28,7 +28,7 @@ for i in range(0x20): #ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,)) INFINITY = float('inf') -FLOAT_REPR = repr +FLOAT_REPR = float.__repr__ def encode_basestring(s): """Return a JSON representation of a Python string diff --git a/Lib/json/tests/test_float.py b/Lib/json/tests/test_float.py index 049f9ae183..c10381da5a 100644 --- a/Lib/json/tests/test_float.py +++ b/Lib/json/tests/test_float.py @@ -32,6 +32,17 @@ class TestFloat(object): self.assertNotEqual(res[0], res[0]) self.assertRaises(ValueError, self.dumps, [val], allow_nan=False) + def test_float_subclasses_use_float_repr(self): + # Issue 27934. + class PeculiarFloat(float): + def __repr__(self): + return "I'm not valid JSON" + def __str__(self): + return "Neither am I" + + val = PeculiarFloat(3.2) + self.assertEqual(self.loads(self.dumps(val)), val) + class TestPyFloat(TestFloat, PyTest): pass class TestCFloat(TestFloat, CTest): pass diff --git a/Misc/ACKS b/Misc/ACKS index 07e5724fe4..7963a12a75 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -636,6 +636,7 @@ Manuel Jacob David Jacobs Kevin Jacobs Kjetil Jacobsen +Eddie James Bertrand Janin Geert Jansen Jack Jansen diff --git a/Misc/NEWS b/Misc/NEWS index aeccb5478f..9f2a32250d 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,9 @@ Core and Builtins Library ------- +- Issue #27934: Use ``float.__repr__`` instead of plain ``repr`` when JSON- + encoding an instance of a float subclass. Thanks Eddie James. + - Issue #27861: Fixed a crash in sqlite3.Connection.cursor() when a factory creates not a cursor. Patch by Xiang Zhang. diff --git a/Modules/_json.c b/Modules/_json.c index c301546057..2d66083186 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -1960,8 +1960,8 @@ encoder_encode_float(PyEncoderObject *s, PyObject *obj) return PyString_FromString("NaN"); } } - /* Use a better float format here? */ - return PyObject_Repr(obj); + /* Make sure to use the base float class repr method */ + return PyFloat_Type.tp_repr(obj); } static PyObject *