[Python-checkins] python/dist/src/Lib copy.py,1.31,1.32
gvanrossum@users.sourceforge.net
gvanrossum@users.sourceforge.net
2003年2月06日 11:53:24 -0800
Update of /cvsroot/python/python/dist/src/Lib
In directory sc8-pr-cvs1:/tmp/cvs-serv15843
Modified Files:
copy.py
Log Message:
Support all the new stuff supported by the new pickle code:
- subclasses of list or dict
- __reduce__ returning a 4-tuple or 5-tuple
- slots
Index: copy.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/copy.py,v
retrieving revision 1.31
retrieving revision 1.32
diff -C2 -d -r1.31 -r1.32
*** copy.py 6 Feb 2003 18:18:23 -0000 1.31
--- copy.py 6 Feb 2003 19:53:22 -0000 1.32
***************
*** 8,12 ****
x = copy.deepcopy(y) # make a deep copy of y
! For module specific errors, copy.error is raised.
The difference between shallow and deep copying is only relevant for
--- 8,12 ----
x = copy.deepcopy(y) # make a deep copy of y
! For module specific errors, copy.Error is raised.
The difference between shallow and deep copying is only relevant for
***************
*** 52,55 ****
--- 52,56 ----
import types
+ from pickle import _slotnames
class Error(Exception):
***************
*** 62,66 ****
PyStringMap = None
! __all__ = ["Error", "error", "copy", "deepcopy"]
def copy(x):
--- 63,67 ----
PyStringMap = None
! __all__ = ["Error", "copy", "deepcopy"]
def copy(x):
***************
*** 77,86 ****
except AttributeError:
try:
! reductor = x.__reduce__
except AttributeError:
! raise error, \
! "un(shallow)copyable object of type %s" % type(x)
else:
! y = _reconstruct(x, reductor(), 0)
else:
y = copier()
--- 78,88 ----
except AttributeError:
try:
! reductor = x.__class__.__reduce__
! if reductor == object.__reduce__:
! reductor = _better_reduce
except AttributeError:
! raise Error("un(shallow)copyable object of type %s" % type(x))
else:
! y = _reconstruct(x, reductor(x), 0)
else:
y = copier()
***************
*** 89,92 ****
--- 91,135 ----
return y
+ def __newobj__(cls, *args):
+ return cls.__new__(cls, *args)
+
+ def _better_reduce(obj):
+ cls = obj.__class__
+ getnewargs = getattr(obj, "__getnewargs__", None)
+ if getnewargs:
+ args = getnewargs()
+ else:
+ args = ()
+ getstate = getattr(obj, "__getstate__", None)
+ if getstate:
+ try:
+ state = getstate()
+ except TypeError, err:
+ # XXX Catch generic exception caused by __slots__
+ if str(err) != ("a class that defines __slots__ "
+ "without defining __getstate__ "
+ "cannot be pickled"):
+ raise # Not that specific exception
+ getstate = None
+ if not getstate:
+ state = getattr(obj, "__dict__", None)
+ names = _slotnames(cls)
+ if names:
+ slots = {}
+ nil = []
+ for name in names:
+ value = getattr(obj, name, nil)
+ if value is not nil:
+ slots[name] = value
+ if slots:
+ state = (state, slots)
+ listitems = dictitems = None
+ if isinstance(obj, list):
+ listitems = iter(obj)
+ elif isinstance(obj, dict):
+ dictitems = obj.iteritems()
+ return __newobj__, (cls, args), state, listitems, dictitems
+
+
_copy_dispatch = d = {}
***************
*** 176,185 ****
except AttributeError:
try:
! reductor = x.__reduce__
except AttributeError:
! raise error, \
! "un-deep-copyable object of type %s" % type(x)
else:
! y = _reconstruct(x, reductor(), 1, memo)
else:
y = copier(memo)
--- 219,230 ----
except AttributeError:
try:
! reductor = x.__class__.__reduce__
! if reductor == object.__reduce__:
! reductor = _better_reduce
except AttributeError:
! raise Error("un(shallow)copyable object of type %s" %
! type(x))
else:
! y = _reconstruct(x, reductor(x), 1, memo)
else:
y = copier(memo)
***************
*** 332,336 ****
y.__setstate__(state)
else:
! y.__dict__.update(state)
return y
--- 377,389 ----
y.__setstate__(state)
else:
! if isinstance(state, tuple) and len(state) == 2:
! state, slotstate = state
! else:
! slotstate = None
! if state is not None:
! y.__dict__.update(state)
! if slotstate is not None:
! for key, value in slotstate.iteritems():
! setattr(y, key, value)
return y