[issue30343] Subclassed json.JSONEncoder does not respect default method for supported types

2020-10-19 Thread Éric Araujo

Éric Araujo  added the comment:

See also https://bugs.python.org/issue34858

This needs a discussion on python-ideas or -dev.

--
nosy: +eric.araujo

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue30343] Subclassed json.JSONEncoder does not respect default method for supported types

2017-05-12 Thread Christopher Harrison

Christopher Harrison added the comment:

I have written a proof-of-concept implementation and submitted a pull request. 
See the PR for details: https://github.com/python/cpython/pull/1558

(My CLA is pending; submitted around 2017-05-12T10:30:00Z+0100)

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue30343] Subclassed json.JSONEncoder does not respect default method for supported types

2017-05-12 Thread Christopher Harrison

Changes by Christopher Harrison :


--
pull_requests: +1654

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue30343] Subclassed json.JSONEncoder does not respect default method for supported types

2017-05-11 Thread Christopher Harrison

New submission from Christopher Harrison:

If you subclass `json.JSONEncoder` to enable serialisation of custom types 
beyond those supported, you are meant to transform values of said type into a 
serialisable version within an overridden `default` method. For example:

class MyJSONEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, MyType):
return str(o)

# Raise TypeError when we have a type we can't serialise
super().default(o)

This, however, won't work if your custom type is an instance of one of the 
supported types. This is because, in Lib/json/encoder.py, the `_iterencode` 
function (defined in `_make_iterencode`) type checks against supported types 
before it delegates to the `default` method.

The reason this came up is because I wanted to serialise a named tuple into a 
JSON object, with keys corresponding to the named tuple's field names. Ignoring 
the merits (or otherwise) of this desired outcome, this can't work because a 
named tuple is still a tuple and thus the `default` method is never called.

In Python 2.7, the `_iterencode` method was part of the `JSONEncoder` class, so 
you could override it in a subclass; even if doing so is somewhat brittle. In 
Python 3, this method has been moved out into the module namespace (tested in 
3.6; looking through the repo, it looks like this change was made in Python 
3.1), so it can't easily be monkey-patched without it affecting other things.

I believe this to be a bug. It seems reasonable to subclass at least named 
tuples, dictionaries and lists in such a way that you'd want a different JSON 
serialisation to their defaults.

--
components: Library (Lib)
messages: 293494
nosy: Christopher Harrison
priority: normal
severity: normal
status: open
title: Subclassed json.JSONEncoder does not respect default method for 
supported types
type: behavior
versions: Python 3.6

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com