blob: 739cf2d7cd83a9d47ed56fbeb40392f55f64fa6d [file] [log] [blame]
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +00001"""Generic (shallow and deep) copying operations.
Guido van Rossum409780f1995-01-10 00:34:21 +00002
Guido van Rossumcc6764c1995-02-09 17:18:10 +00003Interface summary:
4
Tim Peters88869f92001-01-14 23:36:06 +00005 import copy
Guido van Rossumcc6764c1995-02-09 17:18:10 +00006
Tim Peters88869f92001-01-14 23:36:06 +00007 x = copy.copy(y) # make a shallow copy of y
8 x = copy.deepcopy(y) # make a deep copy of y
Guido van Rossumcc6764c1995-02-09 17:18:10 +00009
Guido van Rossumc7557582003-02-06 19:53:22 +000010For module specific errors, copy.Error is raised.
Guido van Rossumcc6764c1995-02-09 17:18:10 +000011
12The difference between shallow and deep copying is only relevant for
13compound objects (objects that contain other objects, like lists or
14class instances).
15
16- A shallow copy constructs a new compound object and then (to the
17 extent possible) inserts *the same objects* into in that the
18 original contains.
19
20- A deep copy constructs a new compound object and then, recursively,
21 inserts *copies* into it of the objects found in the original.
22
23Two problems often exist with deep copy operations that don't exist
24with shallow copy operations:
25
Guido van Rossumf7cea101997-05-28 19:31:14 +000026 a) recursive objects (compound objects that, directly or indirectly,
Guido van Rossumcc6764c1995-02-09 17:18:10 +000027 contain a reference to themselves) may cause a recursive loop
28
Guido van Rossumf7cea101997-05-28 19:31:14 +000029 b) because deep copy copies *everything* it may copy too much, e.g.
Guido van Rossumcc6764c1995-02-09 17:18:10 +000030 administrative data structures that should be shared even between
31 copies
32
33Python's deep copy operation avoids these problems by:
34
Guido van Rossumf7cea101997-05-28 19:31:14 +000035 a) keeping a table of objects already copied during the current
36 copying pass
Guido van Rossumcc6764c1995-02-09 17:18:10 +000037
Guido van Rossumf7cea101997-05-28 19:31:14 +000038 b) letting user-defined classes override the copying operation or the
Guido van Rossumcc6764c1995-02-09 17:18:10 +000039 set of components copied
40
41This version does not copy types like module, class, function, method,
42nor stack trace, stack frame, nor file, socket, window, nor array, nor
43any similar types.
44
45Classes can use the same interfaces to control copying that they use
46to control pickling: they can define methods called __getinitargs__(),
Guido van Rossumc5d2d511997-12-07 16:18:22 +000047__getstate__() and __setstate__(). See the documentation for module
Guido van Rossumcc6764c1995-02-09 17:18:10 +000048"pickle" for information on these methods.
49"""
Guido van Rossum409780f1995-01-10 00:34:21 +000050
Guido van Rossumabfdd701997-10-07 14:47:50 +000051# XXX need to support copy_reg here too...
52
Guido van Rossum409780f1995-01-10 00:34:21 +000053import types
Guido van Rossumc7557582003-02-06 19:53:22 +000054from pickle import _slotnames
Guido van Rossum409780f1995-01-10 00:34:21 +000055
Fred Drake227b1202000-08-17 05:06:49 +000056class Error(Exception):
Tim Peters88869f92001-01-14 23:36:06 +000057 pass
58error = Error # backward compatibility
Guido van Rossum409780f1995-01-10 00:34:21 +000059
Guido van Rossumf8baad02000-11-27 21:53:14 +000060try:
61 from org.python.core import PyStringMap
62except ImportError:
63 PyStringMap = None
64
Guido van Rossumc7557582003-02-06 19:53:22 +000065__all__ = ["Error", "copy", "deepcopy"]
Skip Montanaroe99d5ea2001-01-20 19:54:20 +000066
Guido van Rossum409780f1995-01-10 00:34:21 +000067def copy(x):
Tim Peters88869f92001-01-14 23:36:06 +000068 """Shallow copy operation on arbitrary Python objects.
Guido van Rossumcc6764c1995-02-09 17:18:10 +000069
Tim Peters88869f92001-01-14 23:36:06 +000070 See the module's __doc__ string for more info.
71 """
Guido van Rossumcc6764c1995-02-09 17:18:10 +000072
Tim Peters88869f92001-01-14 23:36:06 +000073 try:
74 copierfunction = _copy_dispatch[type(x)]
75 except KeyError:
76 try:
77 copier = x.__copy__
78 except AttributeError:
Guido van Rossum6cef6d52001-09-28 18:13:29 +000079 try:
Guido van Rossumc7557582003-02-06 19:53:22 +000080 reductor = x.__class__.__reduce__
81 if reductor == object.__reduce__:
82 reductor = _better_reduce
Guido van Rossum6cef6d52001-09-28 18:13:29 +000083 except AttributeError:
Guido van Rossumc7557582003-02-06 19:53:22 +000084 raise Error("un(shallow)copyable object of type %s" % type(x))
Guido van Rossum6cef6d52001-09-28 18:13:29 +000085 else:
Guido van Rossumc7557582003-02-06 19:53:22 +000086 y = _reconstruct(x, reductor(x), 0)
Guido van Rossum6cef6d52001-09-28 18:13:29 +000087 else:
88 y = copier()
Tim Peters88869f92001-01-14 23:36:06 +000089 else:
90 y = copierfunction(x)
91 return y
Guido van Rossum409780f1995-01-10 00:34:21 +000092
Guido van Rossumc7557582003-02-06 19:53:22 +000093def __newobj__(cls, *args):
94 return cls.__new__(cls, *args)
95
96def _better_reduce(obj):
97 cls = obj.__class__
98 getnewargs = getattr(obj, "__getnewargs__", None)
99 if getnewargs:
100 args = getnewargs()
101 else:
102 args = ()
103 getstate = getattr(obj, "__getstate__", None)
104 if getstate:
105 try:
106 state = getstate()
107 except TypeError, err:
108 # XXX Catch generic exception caused by __slots__
109 if str(err) != ("a class that defines __slots__ "
110 "without defining __getstate__ "
111 "cannot be pickled"):
112 raise # Not that specific exception
113 getstate = None
114 if not getstate:
115 state = getattr(obj, "__dict__", None)
116 names = _slotnames(cls)
117 if names:
118 slots = {}
119 nil = []
120 for name in names:
121 value = getattr(obj, name, nil)
122 if value is not nil:
123 slots[name] = value
124 if slots:
125 state = (state, slots)
126 listitems = dictitems = None
127 if isinstance(obj, list):
128 listitems = iter(obj)
129 elif isinstance(obj, dict):
130 dictitems = obj.iteritems()
Guido van Rossum85233bf2003-02-06 21:25:12 +0000131 return __newobj__, (cls,) + args, state, listitems, dictitems
Guido van Rossumc7557582003-02-06 19:53:22 +0000132
133
Guido van Rossum409780f1995-01-10 00:34:21 +0000134_copy_dispatch = d = {}
135
136def _copy_atomic(x):
Tim Peters88869f92001-01-14 23:36:06 +0000137 return x
Guido van Rossum409780f1995-01-10 00:34:21 +0000138d[types.NoneType] = _copy_atomic
139d[types.IntType] = _copy_atomic
140d[types.LongType] = _copy_atomic
141d[types.FloatType] = _copy_atomic
Martin v. Löwis71b75562003-01-16 10:40:00 +0000142d[types.BooleanType] = _copy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000143try:
144 d[types.ComplexType] = _copy_atomic
145except AttributeError:
146 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000147d[types.StringType] = _copy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000148try:
149 d[types.UnicodeType] = _copy_atomic
150except AttributeError:
151 pass
Guido van Rossum2fff84d1999-01-25 21:37:02 +0000152try:
Tim Peters88869f92001-01-14 23:36:06 +0000153 d[types.CodeType] = _copy_atomic
Guido van Rossum2fff84d1999-01-25 21:37:02 +0000154except AttributeError:
Tim Peters88869f92001-01-14 23:36:06 +0000155 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000156d[types.TypeType] = _copy_atomic
157d[types.XRangeType] = _copy_atomic
Guido van Rossum55d2f391995-03-14 17:41:36 +0000158d[types.ClassType] = _copy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +0000159
160def _copy_list(x):
Tim Peters88869f92001-01-14 23:36:06 +0000161 return x[:]
Guido van Rossum409780f1995-01-10 00:34:21 +0000162d[types.ListType] = _copy_list
163
164def _copy_tuple(x):
Tim Peters88869f92001-01-14 23:36:06 +0000165 return x[:]
Guido van Rossum409780f1995-01-10 00:34:21 +0000166d[types.TupleType] = _copy_tuple
167
168def _copy_dict(x):
Tim Peters88869f92001-01-14 23:36:06 +0000169 return x.copy()
Guido van Rossum409780f1995-01-10 00:34:21 +0000170d[types.DictionaryType] = _copy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000171if PyStringMap is not None:
172 d[PyStringMap] = _copy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000173
174def _copy_inst(x):
Tim Peters88869f92001-01-14 23:36:06 +0000175 if hasattr(x, '__copy__'):
176 return x.__copy__()
177 if hasattr(x, '__getinitargs__'):
178 args = x.__getinitargs__()
179 y = apply(x.__class__, args)
180 else:
181 y = _EmptyClass()
182 y.__class__ = x.__class__
183 if hasattr(x, '__getstate__'):
184 state = x.__getstate__()
185 else:
186 state = x.__dict__
187 if hasattr(y, '__setstate__'):
188 y.__setstate__(state)
189 else:
190 y.__dict__.update(state)
191 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000192d[types.InstanceType] = _copy_inst
193
194del d
195
196def deepcopy(x, memo = None):
Tim Peters88869f92001-01-14 23:36:06 +0000197 """Deep copy operation on arbitrary Python objects.
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000198
Tim Peters88869f92001-01-14 23:36:06 +0000199 See the module's __doc__ string for more info.
200 """
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000201
Tim Peters88869f92001-01-14 23:36:06 +0000202 if memo is None:
203 memo = {}
204 d = id(x)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000205 if d in memo:
Tim Peters88869f92001-01-14 23:36:06 +0000206 return memo[d]
207 try:
208 copierfunction = _deepcopy_dispatch[type(x)]
209 except KeyError:
210 try:
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000211 issc = issubclass(type(x), type)
212 except TypeError:
213 issc = 0
214 if issc:
215 y = _deepcopy_dispatch[type](x, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000216 else:
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000217 try:
218 copier = x.__deepcopy__
219 except AttributeError:
220 try:
Guido van Rossumc7557582003-02-06 19:53:22 +0000221 reductor = x.__class__.__reduce__
222 if reductor == object.__reduce__:
223 reductor = _better_reduce
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000224 except AttributeError:
Guido van Rossumc7557582003-02-06 19:53:22 +0000225 raise Error("un(shallow)copyable object of type %s" %
226 type(x))
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000227 else:
Guido van Rossumc7557582003-02-06 19:53:22 +0000228 y = _reconstruct(x, reductor(x), 1, memo)
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000229 else:
230 y = copier(memo)
Tim Peters88869f92001-01-14 23:36:06 +0000231 else:
232 y = copierfunction(x, memo)
233 memo[d] = y
Guido van Rossum61154602002-08-12 20:20:08 +0000234 _keep_alive(x, memo) # Make sure x lives at least as long as d
Tim Peters88869f92001-01-14 23:36:06 +0000235 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000236
237_deepcopy_dispatch = d = {}
238
239def _deepcopy_atomic(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000240 return x
Guido van Rossum409780f1995-01-10 00:34:21 +0000241d[types.NoneType] = _deepcopy_atomic
242d[types.IntType] = _deepcopy_atomic
243d[types.LongType] = _deepcopy_atomic
244d[types.FloatType] = _deepcopy_atomic
Martin v. Löwis71b75562003-01-16 10:40:00 +0000245d[types.BooleanType] = _deepcopy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000246try:
247 d[types.ComplexType] = _deepcopy_atomic
248except AttributeError:
249 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000250d[types.StringType] = _deepcopy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000251try:
252 d[types.UnicodeType] = _deepcopy_atomic
253except AttributeError:
254 pass
Guido van Rossum88b666c2002-02-28 23:19:52 +0000255try:
256 d[types.CodeType] = _deepcopy_atomic
257except AttributeError:
258 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000259d[types.TypeType] = _deepcopy_atomic
260d[types.XRangeType] = _deepcopy_atomic
261
262def _deepcopy_list(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000263 y = []
264 memo[id(x)] = y
265 for a in x:
266 y.append(deepcopy(a, memo))
267 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000268d[types.ListType] = _deepcopy_list
269
270def _deepcopy_tuple(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000271 y = []
272 for a in x:
273 y.append(deepcopy(a, memo))
274 d = id(x)
275 try:
276 return memo[d]
277 except KeyError:
278 pass
279 for i in range(len(x)):
280 if x[i] is not y[i]:
281 y = tuple(y)
282 break
283 else:
284 y = x
285 memo[d] = y
286 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000287d[types.TupleType] = _deepcopy_tuple
288
289def _deepcopy_dict(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000290 y = {}
291 memo[id(x)] = y
Raymond Hettingere0d49722002-06-02 18:55:56 +0000292 for key, value in x.iteritems():
293 y[deepcopy(key, memo)] = deepcopy(value, memo)
Tim Peters88869f92001-01-14 23:36:06 +0000294 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000295d[types.DictionaryType] = _deepcopy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000296if PyStringMap is not None:
297 d[PyStringMap] = _deepcopy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000298
Guido van Rossum558be281997-08-20 22:26:19 +0000299def _keep_alive(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000300 """Keeps a reference to the object x in the memo.
Guido van Rossum558be281997-08-20 22:26:19 +0000301
Tim Peters88869f92001-01-14 23:36:06 +0000302 Because we remember objects by their id, we have
303 to assure that possibly temporary objects are kept
304 alive by referencing them.
305 We store a reference at the id of the memo, which should
306 normally not be used unless someone tries to deepcopy
307 the memo itself...
308 """
309 try:
310 memo[id(memo)].append(x)
311 except KeyError:
312 # aha, this is the first one :-)
313 memo[id(memo)]=[x]
Guido van Rossum558be281997-08-20 22:26:19 +0000314
Guido van Rossum409780f1995-01-10 00:34:21 +0000315def _deepcopy_inst(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000316 if hasattr(x, '__deepcopy__'):
317 return x.__deepcopy__(memo)
318 if hasattr(x, '__getinitargs__'):
319 args = x.__getinitargs__()
Tim Peters88869f92001-01-14 23:36:06 +0000320 args = deepcopy(args, memo)
321 y = apply(x.__class__, args)
322 else:
323 y = _EmptyClass()
324 y.__class__ = x.__class__
325 memo[id(x)] = y
326 if hasattr(x, '__getstate__'):
327 state = x.__getstate__()
Tim Peters88869f92001-01-14 23:36:06 +0000328 else:
329 state = x.__dict__
330 state = deepcopy(state, memo)
331 if hasattr(y, '__setstate__'):
332 y.__setstate__(state)
333 else:
334 y.__dict__.update(state)
335 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000336d[types.InstanceType] = _deepcopy_inst
337
Guido van Rossum1e91c142001-12-28 21:33:22 +0000338def _reconstruct(x, info, deep, memo=None):
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000339 if isinstance(info, str):
340 return x
341 assert isinstance(info, tuple)
Guido van Rossum1e91c142001-12-28 21:33:22 +0000342 if memo is None:
343 memo = {}
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000344 n = len(info)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000345 assert n in (2, 3, 4, 5)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000346 callable, args = info[:2]
347 if n > 2:
348 state = info[2]
349 else:
350 state = {}
Guido van Rossum90e05b02003-02-06 18:18:23 +0000351 if n > 3:
352 listiter = info[3]
353 else:
354 listiter = None
355 if n > 4:
356 dictiter = info[4]
357 else:
358 dictiter = None
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000359 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000360 args = deepcopy(args, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000361 y = callable(*args)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000362 if listiter is not None:
363 for item in listiter:
364 if deep:
365 item = deepcopy(item, memo)
366 y.append(item)
367 if dictiter is not None:
368 for key, value in dictiter:
369 if deep:
370 key = deepcopy(key, memo)
371 value = deepcopy(value, memo)
372 y[key] = value
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000373 if state:
374 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000375 state = deepcopy(state, memo)
Guido van Rossum3e3583c2002-06-06 17:41:20 +0000376 if hasattr(y, '__setstate__'):
377 y.__setstate__(state)
378 else:
Guido van Rossumc7557582003-02-06 19:53:22 +0000379 if isinstance(state, tuple) and len(state) == 2:
380 state, slotstate = state
381 else:
382 slotstate = None
383 if state is not None:
384 y.__dict__.update(state)
385 if slotstate is not None:
386 for key, value in slotstate.iteritems():
387 setattr(y, key, value)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000388 return y
389
Guido van Rossum409780f1995-01-10 00:34:21 +0000390del d
391
392del types
393
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000394# Helper for instance creation without calling __init__
395class _EmptyClass:
396 pass
397
Guido van Rossum409780f1995-01-10 00:34:21 +0000398def _test():
Tim Peters88869f92001-01-14 23:36:06 +0000399 l = [None, 1, 2L, 3.14, 'xyzzy', (1, 2L), [3.14, 'abc'],
400 {'abc': 'ABC'}, (), [], {}]
401 l1 = copy(l)
402 print l1==l
403 l1 = map(copy, l)
404 print l1==l
405 l1 = deepcopy(l)
406 print l1==l
407 class C:
408 def __init__(self, arg=None):
409 self.a = 1
410 self.arg = arg
411 if __name__ == '__main__':
412 import sys
413 file = sys.argv[0]
414 else:
415 file = __file__
416 self.fp = open(file)
417 self.fp.close()
418 def __getstate__(self):
419 return {'a': self.a, 'arg': self.arg}
420 def __setstate__(self, state):
Raymond Hettingere0d49722002-06-02 18:55:56 +0000421 for key, value in state.iteritems():
422 setattr(self, key, value)
Tim Peters88869f92001-01-14 23:36:06 +0000423 def __deepcopy__(self, memo = None):
424 new = self.__class__(deepcopy(self.arg, memo))
425 new.a = self.a
426 return new
427 c = C('argument sketch')
428 l.append(c)
429 l2 = copy(l)
430 print l == l2
431 print l
432 print l2
433 l2 = deepcopy(l)
434 print l == l2
435 print l
436 print l2
437 l.append({l[1]: l, 'xyz': l[2]})
438 l3 = copy(l)
439 import repr
440 print map(repr.repr, l)
441 print map(repr.repr, l1)
442 print map(repr.repr, l2)
443 print map(repr.repr, l3)
444 l3 = deepcopy(l)
445 import repr
446 print map(repr.repr, l)
447 print map(repr.repr, l1)
448 print map(repr.repr, l2)
449 print map(repr.repr, l3)
Guido van Rossum409780f1995-01-10 00:34:21 +0000450
451if __name__ == '__main__':
Tim Peters88869f92001-01-14 23:36:06 +0000452 _test()