On Fri, 9 Aug 2019 at 14:49, Richard Musil <risa20...@gmail.com> wrote:

> Joao S. O. Bueno wrote:
>
> > However, as noted, there is no way to customize Python JSON encoder
> > to encode an arbitrary decimal number in JSON, even though the standard
> does
> > allow it, and Python supports then via decimal.Decimal.
> > Short of a long term solution, like a __json__ protocol, or at least
> special
> > support in Python json module for objects of type "numbers.Number",
> > the only way to go, is, as you are asking, being able to insert "raw
> > strings into json".
>
> Would the approach I outlined in my answer to Dominik be acceptable?:
>
> 1) Add keyword argument to `json.dump(s)` called `dump_float` which will
> act as a counter part to `parse_float` keyword argument in `json.load(s)`.
> The argument will accept custom type (class) for the user's "float"
> representation (for example `decimal.Decimal`).
>

yes,  just that it should be called `dump_as_float` and take either a class
or a tuple-of-classes  (or maybe just another argument that when set to
"True" would
work for any object for which isinstance(obj, numbers.Number) is True)


>
> 2) If specified by the client code, JSONEncoder, when identifying object
> of that type in the input data will encode it using the special rule
> suggested by Dominik:
> ```
> # if o is custom float type
> if isinstance(o, <dump_float Type>):
>     dump_val = str(o)
>     try:
>         float(dump_val)
>     except ValueError:
>         raise TypeError('... is not JSON serializable float number') from
> None
>     <write dump_val to the stream>
> ```
> This would have following implications/consequences:
> 1) str(o) may return invalid float, but the check will not let it into the
> stream.
> 2) the contract between the custom float class implementation and standard
> `json` module will be pretty clear - it must implement the serialization in
> its __str__ function and must return valid float.
> 3) the standard implementation does not need to `import decimal`. If the
> client code needs this feature, it will `import decimal` itself.
> 4) definition which class/type objects should be handled by this rule will
> be pretty clear, it will be the only one specified in `dump_float` argument
> (if specified at all).
>

Yes, but I don know if the reverse float checking is over-policying it - it
is not the role of the language or its libraries
to prevent any way that the JSON encoded string is valid-json. So, maybe
emitting a warning there, but
raising TypeError will only make someone intending to encode numbers in
Hexadecimal in her  custom JSON to pop
here crying tomorrow.



> _______________________________________________
> Python-ideas mailing list -- python-ideas@python.org
> To unsubscribe send an email to python-ideas-le...@python.org
> https://mail.python.org/mailman3/lists/python-ideas.python.org/
> Message archived at
> https://mail.python.org/archives/list/python-ideas@python.org/message/7HCLSKOKRRPNEBZRQGA7F3BEVLX4GXU6/
> Code of Conduct: http://python.org/psf/codeofconduct/
>
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/OYZ3YDZFC4UO3FU6XCDIUCQOSZSBSIJL/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to