[Python-ideas] Make __reduce__ to correspond to __getnewargs_ex__

Neil Girdhar mistersheik at gmail.com
Mon Jun 9 00:18:00 CEST 2014


On Sun, Jun 8, 2014 at 3:13 PM, Ethan Furman <ethan at stoneleaf.us> wrote:

> On 06/08/2014 10:59 AM, Neil Girdhar wrote:
>
>> On Sun, Jun 8, 2014 at 6:03 AM, Nick Coghlan wrote:
>>
>>>
>>> Those classes shouldn't use reduce for their pickling support.
>>>
>>
>> Of course they should?  What should they use?
>>
>
> They should use the methods that make sense.  Pickling is a protocol.  It
> will use (in, I believe, this order):
>
>   __getnewargs_ex__
>
>   __getnewargs__
>
>   __reduce_ex__
>
>   __reduce__
>

In fact, the reduce functions come first.  The order is:

reduce_ex
reduce
getnewargs_ex and getstate (3.4+)
getnewargs_ex (3.4+)
getnewargs and getstate
getnewargs
getstate
default code that copies/pickles the dict

Up until 3.3, a "default" reduce function might be:

def __reduce__(self):
     return type(self), self.__getnewargs__(), self.__getstate__()

It' s no longer possible to write a default reduce function in 3.4 given
the addtion __getnewargs_ex__.  What I am suggesting is to add a new
protocol so that reduce returns the keyword arguments.

Best,

Neil


>
> I'm not sure where __getstate__ and __setstate__ fit in, and happily I
> don't need to unless I'm subclassing something that makes use of them.
>

You really should find out where they fit in before you reply to a message
about them :)

>
> Anyway, back to the story.
>
> When you call pickle.dump, that code will look for the most advanced
> method available on the object you are trying to pickle, and use it.
>  (Well, the most advanced method for the protocol version you have
> selected, that's available on the object.)  So, if you selected protocol 2,
> then the pickle code will look for __getnewargs__, but not
> __getnewargs_ex__, as __getnewargs_ex__ isn't available until protocol 4.
>
> This is similar to iterating:  first choice for iterating is to call an
> object's __iter__ method, but if there isn't one Python will fall back to
> using __getitem__ using integers from 0 until IndexError is raised.
>
>
> --
> ~Ethan~
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
> --
>
> --- You received this message because you are subscribed to a topic in the
> Google Groups "python-ideas" group.
> To unsubscribe from this topic, visit https://groups.google.com/d/
> topic/python-ideas/zohH2BCtYzY/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> python-ideas+unsubscribe at googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20140608/1a7fe10a/attachment.html>


More information about the Python-ideas mailing list