[Python-checkins] python/dist/src/Lib copy.py,1.36,1.37 copy_reg.py,1.21,1.22

gvanrossum@users.sourceforge.net gvanrossum@users.sourceforge.net
Tue, 18 Feb 2003 17:19:30 -0800


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

Modified Files:
	copy.py copy_reg.py 
Log Message:
Use __reduce_ex__ in copy.py.  The test_*copy_cant() tests are simpler again.


Index: copy.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/copy.py,v
retrieving revision 1.36
retrieving revision 1.37
diff -C2 -d -r1.36 -r1.37
*** copy.py	7 Feb 2003 17:53:20 -0000	1.36
--- copy.py	19 Feb 2003 01:19:27 -0000	1.37
***************
*** 80,91 ****
  
      reductor = dispatch_table.get(cls)
!     if not reductor:
!         reductor = getattr(cls, "__reduce__", None)
!         if reductor == object.__reduce__:
!             reductor = _better_reduce
!         elif not reductor:
!             raise Error("un(shallow)copyable object of type %s" % cls)
  
!     return _reconstruct(x, reductor(x), 0)
      
  
--- 80,97 ----
  
      reductor = dispatch_table.get(cls)
!     if reductor:
!         rv = reductor(x)
!     else:
!         reductor = getattr(x, "__reduce_ex__", None)
!         if reductor:
!             rv = reductor(2)
!         else:
!             reductor = getattr(x, "__reduce__", None)
!             if reductor:
!                 rv = reductor()
!             else:
!                 raise Error("un(shallow)copyable object of type %s" % cls)
  
!     return _reconstruct(x, rv, 0)
      
  
***************
*** 177,195 ****
              issc = 0
          if issc:
!             copier = _deepcopy_atomic
!         else:
!             copier = getattr(cls, "__deepcopy__", None)
! 
!         if copier:
!             y = copier(x, memo)
          else:
!             reductor = dispatch_table.get(cls)
!             if not reductor:
!                 reductor = getattr(cls, "__reduce__", None)
!                 if reductor == object.__reduce__:
!                     reductor = _better_reduce
!                 elif not reductor:
!                     raise Error("un(deep)copyable object of type %s" % cls)
!             y = _reconstruct(x, reductor(x), 1, memo)
  
      memo[d] = y
--- 183,207 ----
              issc = 0
          if issc:
!             y = _deepcopy_atomic(x, memo)
          else:
!             copier = getattr(x, "__deepcopy__", None)
!             if copier:
!                 y = copier(memo)
!             else:
!                 reductor = dispatch_table.get(cls)
!                 if reductor:
!                     rv = reductor(x)
!                 else:
!                     reductor = getattr(x, "__reduce_ex__", None)
!                     if reductor:
!                         rv = reductor(2)
!                     else:
!                         reductor = getattr(x, "__reduce__", None)
!                         if reductor:
!                             rv = reductor()
!                         else:
!                             raise Error(
!                                 "un(deep)copyable object of type %s" % cls)
!                 y = _reconstruct(x, rv, 1, memo)
  
      memo[d] = y

Index: copy_reg.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/copy_reg.py,v
retrieving revision 1.21
retrieving revision 1.22
diff -C2 -d -r1.21 -r1.22
*** copy_reg.py	18 Feb 2003 22:05:11 -0000	1.21
--- copy_reg.py	19 Feb 2003 01:19:27 -0000	1.22
***************
*** 114,120 ****
  def _reduce_ex(obj, proto=0):
      obj_reduce = getattr(obj, "__reduce__", None)
!     if obj_reduce and obj.__class__.__reduce__ is not object.__reduce__:
!         return obj_reduce()
!     elif proto < 2:
          return _reduce(obj)
      else:
--- 114,125 ----
  def _reduce_ex(obj, proto=0):
      obj_reduce = getattr(obj, "__reduce__", None)
!     # XXX This fails in test_copy.py line 61
!     if obj_reduce:
!         try:
!             if obj.__class__.__reduce__ is not object.__reduce__:
!                 return obj_reduce()
!         except AttributeError:
!             pass
!     if proto < 2:
          return _reduce(obj)
      else: