[Python-checkins] python/dist/src/Lib copy.py,1.42,1.42.8.1

anthonybaxter at users.sourceforge.net anthonybaxter at users.sourceforge.net
Tue Jan 25 13:52:21 CET 2005


Update of /cvsroot/python/python/dist/src/Lib
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4976/Lib
Modified Files:
 Tag: release23-maint
	copy.py 
Log Message:
copy.py fixed to first lookup __copy__ from the instance being copied, 
rather than only looking at the type - this was broken in 2.3. 
Index: copy.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/copy.py,v
retrieving revision 1.42
retrieving revision 1.42.8.1
diff -u -d -r1.42 -r1.42.8.1
--- copy.py	14 Jun 2003 07:10:06 -0000	1.42
+++ copy.py	25 Jan 2005 12:52:18 -0000	1.42.8.1
@@ -62,6 +62,15 @@
 
 __all__ = ["Error", "copy", "deepcopy"]
 
+def _getspecial(cls, name):
+ for basecls in cls.__mro__:
+ try:
+ return basecls.__dict__[name]
+ except:
+ pass
+ else:
+ return None
+
 def copy(x):
 """Shallow copy operation on arbitrary Python objects.
 
@@ -74,7 +83,7 @@
 if copier:
 return copier(x)
 
- copier = getattr(cls, "__copy__", None)
+ copier = _getspecial(cls, "__copy__")
 if copier:
 return copier(x)
 
@@ -90,6 +99,9 @@
 if reductor:
 rv = reductor()
 else:
+ copier = getattr(x, "__copy__", None)
+ if copier:
+ return copier()
 raise Error("un(shallow)copyable object of type %s" % cls)
 
 return _reconstruct(x, rv, 0)
@@ -185,9 +197,9 @@
 if issc:
 y = _deepcopy_atomic(x, memo)
 else:
- copier = getattr(x, "__deepcopy__", None)
+ copier = _getspecial(cls, "__deepcopy__")
 if copier:
- y = copier(memo)
+ y = copier(x, memo)
 else:
 reductor = dispatch_table.get(cls)
 if reductor:
@@ -201,6 +213,9 @@
 if reductor:
 rv = reductor()
 else:
+ copier = getattr(x, "__deepcopy__", None)
+ if copier:
+ return copier(memo)
 raise Error(
 "un(deep)copyable object of type %s" % cls)
 y = _reconstruct(x, rv, 1, memo)


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /