blob: 02aa46b50331911515632a2ded31ec8d56881497 [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
51import types
Guido van Rossum9c9cf412003-02-19 01:20:40 +000052from copy_reg import dispatch_table
Guido van Rossum409780f1995-01-10 00:34:21 +000053
Fred Drake227b1202000-08-17 05:06:49 +000054class Error(Exception):
Tim Peters88869f92001-01-14 23:36:06 +000055 pass
56error = Error # backward compatibility
Guido van Rossum409780f1995-01-10 00:34:21 +000057
Guido van Rossumf8baad02000-11-27 21:53:14 +000058try:
59 from org.python.core import PyStringMap
60except ImportError:
61 PyStringMap = None
62
Guido van Rossumc7557582003-02-06 19:53:22 +000063__all__ = ["Error", "copy", "deepcopy"]
Skip Montanaroe99d5ea2001-01-20 19:54:20 +000064
Guido van Rossum409780f1995-01-10 00:34:21 +000065def copy(x):
Tim Peters88869f92001-01-14 23:36:06 +000066 """Shallow copy operation on arbitrary Python objects.
Guido van Rossumcc6764c1995-02-09 17:18:10 +000067
Tim Peters88869f92001-01-14 23:36:06 +000068 See the module's __doc__ string for more info.
69 """
Guido van Rossumcc6764c1995-02-09 17:18:10 +000070
Guido van Rossumc06e3ac2003-02-07 17:30:18 +000071 cls = type(x)
72
73 copier = _copy_dispatch.get(cls)
74 if copier:
75 return copier(x)
76
77 copier = getattr(cls, "__copy__", None)
78 if copier:
79 return copier(x)
80
81 reductor = dispatch_table.get(cls)
Guido van Rossume6908832003-02-19 01:19:28 +000082 if reductor:
83 rv = reductor(x)
84 else:
85 reductor = getattr(x, "__reduce_ex__", None)
86 if reductor:
87 rv = reductor(2)
88 else:
89 reductor = getattr(x, "__reduce__", None)
90 if reductor:
91 rv = reductor()
92 else:
93 raise Error("un(shallow)copyable object of type %s" % cls)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +000094
Guido van Rossume6908832003-02-19 01:19:28 +000095 return _reconstruct(x, rv, 0)
Tim Petersf2715e02003-02-19 02:35:07 +000096
Guido van Rossumc7557582003-02-06 19:53:22 +000097
Guido van Rossum409780f1995-01-10 00:34:21 +000098_copy_dispatch = d = {}
99
100def _copy_atomic(x):
Tim Peters88869f92001-01-14 23:36:06 +0000101 return x
Guido van Rossum409780f1995-01-10 00:34:21 +0000102d[types.NoneType] = _copy_atomic
103d[types.IntType] = _copy_atomic
104d[types.LongType] = _copy_atomic
105d[types.FloatType] = _copy_atomic
Martin v. Löwis71b75562003-01-16 10:40:00 +0000106d[types.BooleanType] = _copy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000107try:
108 d[types.ComplexType] = _copy_atomic
109except AttributeError:
110 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000111d[types.StringType] = _copy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000112try:
113 d[types.UnicodeType] = _copy_atomic
114except AttributeError:
115 pass
Guido van Rossum2fff84d1999-01-25 21:37:02 +0000116try:
Tim Peters88869f92001-01-14 23:36:06 +0000117 d[types.CodeType] = _copy_atomic
Guido van Rossum2fff84d1999-01-25 21:37:02 +0000118except AttributeError:
Tim Peters88869f92001-01-14 23:36:06 +0000119 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000120d[types.TypeType] = _copy_atomic
121d[types.XRangeType] = _copy_atomic
Guido van Rossum55d2f391995-03-14 17:41:36 +0000122d[types.ClassType] = _copy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +0000123
124def _copy_list(x):
Tim Peters88869f92001-01-14 23:36:06 +0000125 return x[:]
Guido van Rossum409780f1995-01-10 00:34:21 +0000126d[types.ListType] = _copy_list
127
128def _copy_tuple(x):
Tim Peters88869f92001-01-14 23:36:06 +0000129 return x[:]
Guido van Rossum409780f1995-01-10 00:34:21 +0000130d[types.TupleType] = _copy_tuple
131
132def _copy_dict(x):
Tim Peters88869f92001-01-14 23:36:06 +0000133 return x.copy()
Guido van Rossum409780f1995-01-10 00:34:21 +0000134d[types.DictionaryType] = _copy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000135if PyStringMap is not None:
136 d[PyStringMap] = _copy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000137
138def _copy_inst(x):
Tim Peters88869f92001-01-14 23:36:06 +0000139 if hasattr(x, '__copy__'):
140 return x.__copy__()
141 if hasattr(x, '__getinitargs__'):
142 args = x.__getinitargs__()
Guido van Rossum68468eb2003-02-27 20:14:51 +0000143 y = x.__class__(*args)
Tim Peters88869f92001-01-14 23:36:06 +0000144 else:
145 y = _EmptyClass()
146 y.__class__ = x.__class__
147 if hasattr(x, '__getstate__'):
148 state = x.__getstate__()
149 else:
150 state = x.__dict__
151 if hasattr(y, '__setstate__'):
152 y.__setstate__(state)
153 else:
154 y.__dict__.update(state)
155 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000156d[types.InstanceType] = _copy_inst
157
158del d
159
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000160def deepcopy(x, memo=None, _nil=[]):
Tim Peters88869f92001-01-14 23:36:06 +0000161 """Deep copy operation on arbitrary Python objects.
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000162
Tim Peters88869f92001-01-14 23:36:06 +0000163 See the module's __doc__ string for more info.
164 """
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000165
Tim Peters88869f92001-01-14 23:36:06 +0000166 if memo is None:
167 memo = {}
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000168
Tim Peters88869f92001-01-14 23:36:06 +0000169 d = id(x)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000170 y = memo.get(d, _nil)
171 if y is not _nil:
172 return y
173
174 cls = type(x)
175
176 copier = _deepcopy_dispatch.get(cls)
177 if copier:
178 y = copier(x, memo)
179 else:
Tim Peters88869f92001-01-14 23:36:06 +0000180 try:
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000181 issc = issubclass(cls, type)
182 except TypeError: # cls is not a class (old Boost; see SF #502085)
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000183 issc = 0
184 if issc:
Guido van Rossume6908832003-02-19 01:19:28 +0000185 y = _deepcopy_atomic(x, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000186 else:
Guido van Rossume6908832003-02-19 01:19:28 +0000187 copier = getattr(x, "__deepcopy__", None)
188 if copier:
189 y = copier(memo)
190 else:
191 reductor = dispatch_table.get(cls)
192 if reductor:
193 rv = reductor(x)
194 else:
195 reductor = getattr(x, "__reduce_ex__", None)
196 if reductor:
197 rv = reductor(2)
198 else:
199 reductor = getattr(x, "__reduce__", None)
200 if reductor:
201 rv = reductor()
202 else:
203 raise Error(
204 "un(deep)copyable object of type %s" % cls)
205 y = _reconstruct(x, rv, 1, memo)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000206
Tim Peters88869f92001-01-14 23:36:06 +0000207 memo[d] = y
Guido van Rossum61154602002-08-12 20:20:08 +0000208 _keep_alive(x, memo) # Make sure x lives at least as long as d
Tim Peters88869f92001-01-14 23:36:06 +0000209 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000210
211_deepcopy_dispatch = d = {}
212
213def _deepcopy_atomic(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000214 return x
Guido van Rossum409780f1995-01-10 00:34:21 +0000215d[types.NoneType] = _deepcopy_atomic
216d[types.IntType] = _deepcopy_atomic
217d[types.LongType] = _deepcopy_atomic
218d[types.FloatType] = _deepcopy_atomic
Martin v. Löwis71b75562003-01-16 10:40:00 +0000219d[types.BooleanType] = _deepcopy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000220try:
221 d[types.ComplexType] = _deepcopy_atomic
222except AttributeError:
223 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000224d[types.StringType] = _deepcopy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000225try:
226 d[types.UnicodeType] = _deepcopy_atomic
227except AttributeError:
228 pass
Guido van Rossum88b666c2002-02-28 23:19:52 +0000229try:
230 d[types.CodeType] = _deepcopy_atomic
231except AttributeError:
232 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000233d[types.TypeType] = _deepcopy_atomic
234d[types.XRangeType] = _deepcopy_atomic
Guido van Rossum1dca4822003-02-07 17:53:23 +0000235d[types.ClassType] = _deepcopy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +0000236
237def _deepcopy_list(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000238 y = []
239 memo[id(x)] = y
240 for a in x:
241 y.append(deepcopy(a, memo))
242 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000243d[types.ListType] = _deepcopy_list
244
245def _deepcopy_tuple(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000246 y = []
247 for a in x:
248 y.append(deepcopy(a, memo))
249 d = id(x)
250 try:
251 return memo[d]
252 except KeyError:
253 pass
254 for i in range(len(x)):
255 if x[i] is not y[i]:
256 y = tuple(y)
257 break
258 else:
259 y = x
260 memo[d] = y
261 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000262d[types.TupleType] = _deepcopy_tuple
263
264def _deepcopy_dict(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000265 y = {}
266 memo[id(x)] = y
Raymond Hettingere0d49722002-06-02 18:55:56 +0000267 for key, value in x.iteritems():
268 y[deepcopy(key, memo)] = deepcopy(value, memo)
Tim Peters88869f92001-01-14 23:36:06 +0000269 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000270d[types.DictionaryType] = _deepcopy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000271if PyStringMap is not None:
272 d[PyStringMap] = _deepcopy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000273
Guido van Rossum558be281997-08-20 22:26:19 +0000274def _keep_alive(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000275 """Keeps a reference to the object x in the memo.
Guido van Rossum558be281997-08-20 22:26:19 +0000276
Tim Peters88869f92001-01-14 23:36:06 +0000277 Because we remember objects by their id, we have
278 to assure that possibly temporary objects are kept
279 alive by referencing them.
280 We store a reference at the id of the memo, which should
281 normally not be used unless someone tries to deepcopy
282 the memo itself...
283 """
284 try:
285 memo[id(memo)].append(x)
286 except KeyError:
287 # aha, this is the first one :-)
288 memo[id(memo)]=[x]
Guido van Rossum558be281997-08-20 22:26:19 +0000289
Guido van Rossum409780f1995-01-10 00:34:21 +0000290def _deepcopy_inst(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000291 if hasattr(x, '__deepcopy__'):
292 return x.__deepcopy__(memo)
293 if hasattr(x, '__getinitargs__'):
294 args = x.__getinitargs__()
Tim Peters88869f92001-01-14 23:36:06 +0000295 args = deepcopy(args, memo)
Guido van Rossum68468eb2003-02-27 20:14:51 +0000296 y = x.__class__(*args)
Tim Peters88869f92001-01-14 23:36:06 +0000297 else:
298 y = _EmptyClass()
299 y.__class__ = x.__class__
300 memo[id(x)] = y
301 if hasattr(x, '__getstate__'):
302 state = x.__getstate__()
Tim Peters88869f92001-01-14 23:36:06 +0000303 else:
304 state = x.__dict__
305 state = deepcopy(state, memo)
306 if hasattr(y, '__setstate__'):
307 y.__setstate__(state)
308 else:
309 y.__dict__.update(state)
310 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000311d[types.InstanceType] = _deepcopy_inst
312
Guido van Rossum1e91c142001-12-28 21:33:22 +0000313def _reconstruct(x, info, deep, memo=None):
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000314 if isinstance(info, str):
315 return x
316 assert isinstance(info, tuple)
Guido van Rossum1e91c142001-12-28 21:33:22 +0000317 if memo is None:
318 memo = {}
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000319 n = len(info)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000320 assert n in (2, 3, 4, 5)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000321 callable, args = info[:2]
322 if n > 2:
323 state = info[2]
324 else:
325 state = {}
Guido van Rossum90e05b02003-02-06 18:18:23 +0000326 if n > 3:
327 listiter = info[3]
328 else:
329 listiter = None
330 if n > 4:
331 dictiter = info[4]
332 else:
333 dictiter = None
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000334 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000335 args = deepcopy(args, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000336 y = callable(*args)
Guido van Rossum99d2c252003-06-13 19:28:47 +0000337 memo[id(x)] = y
Guido van Rossum90e05b02003-02-06 18:18:23 +0000338 if listiter is not None:
339 for item in listiter:
340 if deep:
341 item = deepcopy(item, memo)
342 y.append(item)
343 if dictiter is not None:
344 for key, value in dictiter:
345 if deep:
346 key = deepcopy(key, memo)
347 value = deepcopy(value, memo)
348 y[key] = value
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000349 if state:
350 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000351 state = deepcopy(state, memo)
Guido van Rossum3e3583c2002-06-06 17:41:20 +0000352 if hasattr(y, '__setstate__'):
353 y.__setstate__(state)
354 else:
Guido van Rossumc7557582003-02-06 19:53:22 +0000355 if isinstance(state, tuple) and len(state) == 2:
356 state, slotstate = state
357 else:
358 slotstate = None
359 if state is not None:
360 y.__dict__.update(state)
361 if slotstate is not None:
362 for key, value in slotstate.iteritems():
363 setattr(y, key, value)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000364 return y
365
Guido van Rossum409780f1995-01-10 00:34:21 +0000366del d
367
368del types
369
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000370# Helper for instance creation without calling __init__
371class _EmptyClass:
372 pass
373
Guido van Rossum409780f1995-01-10 00:34:21 +0000374def _test():
Tim Peters88869f92001-01-14 23:36:06 +0000375 l = [None, 1, 2L, 3.14, 'xyzzy', (1, 2L), [3.14, 'abc'],
376 {'abc': 'ABC'}, (), [], {}]
377 l1 = copy(l)
378 print l1==l
379 l1 = map(copy, l)
380 print l1==l
381 l1 = deepcopy(l)
382 print l1==l
383 class C:
384 def __init__(self, arg=None):
385 self.a = 1
386 self.arg = arg
387 if __name__ == '__main__':
388 import sys
389 file = sys.argv[0]
390 else:
391 file = __file__
392 self.fp = open(file)
393 self.fp.close()
394 def __getstate__(self):
395 return {'a': self.a, 'arg': self.arg}
396 def __setstate__(self, state):
Raymond Hettingere0d49722002-06-02 18:55:56 +0000397 for key, value in state.iteritems():
398 setattr(self, key, value)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000399 def __deepcopy__(self, memo=None):
Tim Peters88869f92001-01-14 23:36:06 +0000400 new = self.__class__(deepcopy(self.arg, memo))
401 new.a = self.a
402 return new
403 c = C('argument sketch')
404 l.append(c)
405 l2 = copy(l)
406 print l == l2
407 print l
408 print l2
409 l2 = deepcopy(l)
410 print l == l2
411 print l
412 print l2
413 l.append({l[1]: l, 'xyz': l[2]})
414 l3 = copy(l)
415 import repr
416 print map(repr.repr, l)
417 print map(repr.repr, l1)
418 print map(repr.repr, l2)
419 print map(repr.repr, l3)
420 l3 = deepcopy(l)
421 import repr
422 print map(repr.repr, l)
423 print map(repr.repr, l1)
424 print map(repr.repr, l2)
425 print map(repr.repr, l3)
Guido van Rossum409780f1995-01-10 00:34:21 +0000426
427if __name__ == '__main__':
Tim Peters88869f92001-01-14 23:36:06 +0000428 _test()