New submission from Serhiy Storchaka:
Pickling and copying instances of subclasses of some basic classes pickles and
copies instance attributes. Example:
>>> class BA(bytearray):
... pass
...
>>> b = BA(b'abc')
>>> b.x = 10
>>> c = copy.copy(b)
>>> c.x
10
>>> c = pickle.loads(pickle.dumps(b))
>>> c.x
10
But this doesn't work if attributes are saved not in instance dictionary, but
in slots.
>>> class BA(bytearray):
... __slots__ = ('x',)
...
>>> b = BA(b'abc')
>>> b.x = 10
>>> c = copy.copy(b)
>>> c.x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: x
>>> c = pickle.loads(pickle.dumps(b))
>>> c.x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: x
Since using __slots__ is implementation detail, this failure can be considered
as a bug.
Proposed patch adds support of pickling and copying slots in subclasses of all
classes that already support pickling and copying non-slot attributes. It is
backward compatible, classes with slots can be unpickled on older Python
versions without slots. Affected classes: bytearray, set, frozenset,
weakref.WeakSet, collections.OrderedDict, collections.deque, datetime.tzinfo.
The patch adds the copyreg._getstate() function for Python classes and exposes
the _PyObject_GetState() function for extension classes. An alternative (and
simpler for end user) solution would be to add default implementation as
object.__getstate__(). But this is not easy to reject non-pickleable classes
(issue22995) in this case, since __getstate__ is looked up as instance
attribute, not as other special methods.
----------
components: Extension Modules, Library (Lib)
files: copyreg_getstate.patch
keywords: patch
messages: 261903
nosy: alexandre.vassalotti, pitrou, rhettinger, serhiy.storchaka
priority: normal
severity: normal
stage: patch review
status: open
title: Support pickling slots in subclasses of common classes
type: enhancement
versions: Python 3.6
Added file: http://bugs.python.org/file42183/copyreg_getstate.patch
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue26579>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com