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 <rep...@bugs.python.org> <http://bugs.python.org/issue26579> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com