[Python-checkins] CVS: python/dist/src/Lib copy_reg.py,1.5,1.6

Guido van Rossum gvanrossum@users.sourceforge.net
Tue, 25 Sep 2001 09:26:00 -0700


Update of /cvsroot/python/python/dist/src/Lib
In directory usw-pr-cvs1:/tmp/cvs-serv12467/Lib

Modified Files:
	copy_reg.py 
Log Message:
- 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.



Index: copy_reg.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/copy_reg.py,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** copy_reg.py	2001/01/20 19:54:20	1.5
--- copy_reg.py	2001/09/25 16:25:58	1.6
***************
*** 34,35 ****
--- 34,64 ----
  
  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__