mirror of
https://github.com/python/cpython.git
synced 2025-10-17 20:28:43 +00:00
- Provisional support for pickling new-style objects. (*)
- Made cls.__module__ writable. - Ensure that obj.__dict__ is returned as {}, not None, even upon first reference; it simply springs into life when you ask for it. (*) The pickling support is provisional for the following reasons: - It doesn't support classes with __slots__. - It relies on additional support in copy_reg.py: the C method __reduce__, defined in the object class, really calls calling copy_reg._reduce(obj). Eventually the Python code in copy_reg.py needs to be migrated to C, but I'd like to experiment with the Python implementation first. The _reduce() code also relies on an additional helper function, _reconstructor(), defined in copy_reg.py; this should also be reimplemented in C.
This commit is contained in:
parent
ad39aba2f6
commit
3926a63d05
4 changed files with 142 additions and 12 deletions
|
@ -33,3 +33,32 @@ def pickle_complex(c):
|
|||
return complex, (c.real, c.imag)
|
||||
|
||||
pickle(type(1j), pickle_complex, complex)
|
||||
|
||||
# Support for picking new-style objects
|
||||
|
||||
_dummy_classes = {}
|
||||
|
||||
def _reconstructor(cls, base, state):
|
||||
dummy = _dummy_classes.get(base)
|
||||
if dummy is None:
|
||||
class dummy(base): pass
|
||||
_dummy_classes[base] = dummy
|
||||
obj = dummy(state)
|
||||
obj._foo = 1; del obj._foo # hack to create __dict__
|
||||
obj.__class__ = cls
|
||||
return obj
|
||||
_reconstructor.__safe_for_unpickling__ = 1
|
||||
|
||||
_HEAPTYPE = 1<<9
|
||||
|
||||
def _reduce(self):
|
||||
for base in self.__class__.__mro__:
|
||||
if not base.__flags__ & _HEAPTYPE:
|
||||
break
|
||||
else:
|
||||
base = object # not really reachable
|
||||
if base is object:
|
||||
state = None
|
||||
else:
|
||||
state = base(self)
|
||||
return _reconstructor, (self.__class__, base, state), self.__dict__
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue