Ethan Furman added the comment:

Here's the relevant routine from _json.c:
-----------------------------------------

static PyObject *
encoder_encode_float(PyEncoderObject *s, PyObject *obj)
{
    /* Return the JSON representation of a PyFloat */
    double i = PyFloat_AS_DOUBLE(obj);
    if (!Py_IS_FINITE(i)) {
        if (!s->allow_nan) {
            PyErr_SetString(PyExc_ValueError, "Out of range float values are 
not JSON compliant");
            return NULL;
        }
        if (i > 0) {
            return PyUnicode_FromString("Infinity");
        }
        else if (i < 0) {
            return PyUnicode_FromString("-Infinity");
        }
        else {
            return PyUnicode_FromString("NaN");
        }
    }
    /* Use a better float format here? */
    return PyObject_Repr(obj);
}


Possible solutions
------------------

  - Use PyObject_Str() instead of PyObject_Repr()

    I was unable to find any references to why it isn't currently 
PyObject_Str(), but switching over to it did not break any tests

  - Coerce the obj to a PyFloat, and take the repr of that (just use the `i`)

    float subclasses would always lose the subclass status, but that is lost on 
deserialization anyway unless a custom decoder is used; and if a custom decoder 
is being used I would think a custom encoder is also being used?


Summary
-------

Having hybrid Enums not change __str__ would solve most of the json 
serialization issues;
either of the above two changes will solve the json issue of enumerated floats.

Thoughts on which route to take for json?

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue18264>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to