[Python-ideas] Json object-level serializer

Michael Foord fuzzyman at voidspace.org.uk
Sat Jul 31 14:08:14 CEST 2010

On 30 July 2010 11:39, Nick Coghlan <ncoghlan at gmail.com> wrote:

> On Fri, Jul 30, 2010 at 8:46 AM, Éric Araujo <merwok at netwok.org> wrote:
> > Thank you for explaining generic functions so clearly.
> >
> > Is there a good module out there implementing them without “crazily
> > complex overloading schemes”?
> I'm not sure. Most of my exposure to generic functions is through PJE
> and he's a big fan of pushing them to their limits (hence RuleDispatch
> and PEAK-rules).
> There is an extremely bare bones implementation used internally by
> pkgutil's emulation of the standard import process, but Guido has said
> we shouldn't document or promote that in any official way without a
> PEP (cf. the simple proposal in http://bugs.python.org/issue5135 and
> the PJE's previous more comprehensive proposal in PEP 3124).
> As others have explained more clearly than I did, generic functions
> work better than magic methods when the same basic operation (e.g.
> pretty printing, JSON serialisation) is common to many object types,
> but the details may vary between applications, or even within a single
> application. By giving the application more control over how different
> types are handled (through the generic functions' separate type
> registries) it is much easier to have context dependent behaviour,
> while still fairly easily sharing code in cases where it makes sense.
> E.g. to use Alex Gaynor's example of attendee list serialisation and
> the issue 5135 syntax:
> @functools.simplegeneric
> def json_unauthenticated(obj):
>    return json.dumps(obj) # Default to a basic dumps() call
> @functools.simplegeneric
> def json_authenticated(obj):
>    return json_unauthenticated(obj) # Default to being the same as
> unauthenticated info
> @json_unauthenticated.register(EventAttendees):
> def attendee_titles(attendees):
>    return json.dumps([attendee.title for attendee in attendees])
> @json_authenticated.register(EventAttendees):
> def attendee_details(attendees):
>    return json.dumps([attendee.full_details() for attendee in attendees])

I really like Alex Gaynor's simple MultiMethod implementation. From:


It doesn't have a concept of a default call, but that would be very easy to
add. Basic usage is:

json_unauthenticated = MultiMethod()

def json_unauthenticated(attendees):
    return json.dumps([attendee.title for attendee in attendees])

def json_unauthenticated(othertypes):
    return json.dumps(othertypes)

And so on.


> (Keep in mind that I don't use JSON, so there are likely plenty of
> details wrong with the above, but it should give a basic idea of what
> generic functions are designed to support).
> Cheers,
> Nick.
> --
> Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> http://mail.python.org/mailman/listinfo/python-ideas

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20100731/0e3572f1/attachment.html>

More information about the Python-ideas mailing list