diff options
author | Guido van Rossum <guido@python.org> | 2001-09-25 16:25:58 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2001-09-25 16:25:58 (GMT) |
commit | 3926a63d0579bbeea6ab855a31dc38b9fa56b5e3 (patch) | |
tree | e8819c4a320d632f516cb269ebc28cd96793193f /Lib/copy_reg.py | |
parent | ad39aba2f67d3e7f4405f84167becab6d18ee9bc (diff) | |
download | cpython-3926a63d0579bbeea6ab855a31dc38b9fa56b5e3.zip cpython-3926a63d0579bbeea6ab855a31dc38b9fa56b5e3.tar.gz cpython-3926a63d0579bbeea6ab855a31dc38b9fa56b5e3.tar.bz2 |
- 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.
Diffstat (limited to 'Lib/copy_reg.py')
-rw-r--r-- | Lib/copy_reg.py | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/Lib/copy_reg.py b/Lib/copy_reg.py index e4f0b3c..e93c2a3 100644 --- a/Lib/copy_reg.py +++ b/Lib/copy_reg.py @@ -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__ |