Alexandre Vassalotti added the comment:

I am currently fleshing out an improved implementation for the reduce protocol 
version 4. One thing I am curious about is whether we should keep the special 
cases we currently have there for dict and list subclasses.

I recall Raymond expressed disagreement in #msg83098 about this behavior. I 
agree that having __setitem__ called before __init__ make it harder for dict 
and list subclasses to support pickling. To take advantage of the special case, 
subclasses need to do their required initialization in the __new__ method.

On the other hand, it does decrease the memory requirements for unpickling such 
subclasses---i.e., we can build the object in-place instead of building an 
intermediary list or dict. Reading PEP 307 confirms indeed that was the 
original intention.

One possible solution, other than removing the special case completely, is to 
make sure we initialize the object (using the BUILD opcode) before we call 
__setitem__ or append on it. This would be a simple change that would solve the 
initialization issue. However, I would still feel uneasy about the default 
object.__reduce__ behavior depending on the object's subtype.

I think it could be worthwhile to investigate a generic API for pickling 
collections in-place. For example, a such API would helpful for pickling set 
subclasses in-place.

__items__() or       Return an iterator of the items in the collection. Would be
__getitems__()       equivalent to iter(dict.items()) on dicts and iter(list) on
                     lists.

__additems__(items)  Add a batch of items to the collection. By default, it 
would
                     be defined as:

                         for item in items:
                             self.__additem__(item)

                     However, subclasses would be free to provide a more 
efficient
                     implementation of the method. Would be equivalent to
                     dict.update on dicts and list.extend on lists.

__additem__(item)    Add a single item to the collection. Would be equivalent to
                     dict[item[0]] = item[1] on dicts and list.append on lists.

The collections module's ABCs could then provide default implementations of 
this API, which would give its users efficient in-place pickling automatically.

----------

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

Reply via email to