blob: d26bcdbff6ae5e0938a3befcdcc75ffac5ac5b26 [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
Raymond Hettingerf9d88ab2005-06-13 01:10:15 +000017 extent possible) inserts *the same objects* into it that the
Guido van Rossumcc6764c1995-02-09 17:18:10 +000018 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
Antoine Pitrou6e610062009-05-15 17:04:50 +000052import weakref
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +000053from copyreg import dispatch_table
Antoine Pitroud6399d22010-09-04 17:46:44 +000054import builtins
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
Guido van Rossumc06e3ac2003-02-07 17:30:18 +000073 cls = type(x)
74
75 copier = _copy_dispatch.get(cls)
76 if copier:
77 return copier(x)
78
Alexandre Vassalotti5c1c3b42013-12-01 13:25:26 -080079 try:
80 issc = issubclass(cls, type)
81 except TypeError: # cls is not a class
82 issc = False
83 if issc:
84 # treat it as a regular class:
85 return _copy_immutable(x)
86
Guido van Rossumc06e3ac2003-02-07 17:30:18 +000087 copier = getattr(cls, "__copy__", None)
88 if copier:
89 return copier(x)
90
91 reductor = dispatch_table.get(cls)
Guido van Rossume6908832003-02-19 01:19:28 +000092 if reductor:
93 rv = reductor(x)
94 else:
95 reductor = getattr(x, "__reduce_ex__", None)
96 if reductor:
97 rv = reductor(2)
98 else:
99 reductor = getattr(x, "__reduce__", None)
100 if reductor:
101 rv = reductor()
102 else:
103 raise Error("un(shallow)copyable object of type %s" % cls)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000104
Guido van Rossume6908832003-02-19 01:19:28 +0000105 return _reconstruct(x, rv, 0)
Tim Petersf2715e02003-02-19 02:35:07 +0000106
Guido van Rossumc7557582003-02-06 19:53:22 +0000107
Guido van Rossum409780f1995-01-10 00:34:21 +0000108_copy_dispatch = d = {}
109
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000110def _copy_immutable(x):
Tim Peters88869f92001-01-14 23:36:06 +0000111 return x
Neal Norwitzb69b2e52007-02-27 03:41:04 +0000112for t in (type(None), int, float, bool, str, tuple,
Guido van Rossum13257902007-06-07 23:15:56 +0000113 frozenset, type, range,
Christian Heimescc47b052008-03-25 14:56:36 +0000114 types.BuiltinFunctionType, type(Ellipsis),
Antoine Pitrou6e610062009-05-15 17:04:50 +0000115 types.FunctionType, weakref.ref):
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000116 d[t] = _copy_immutable
Guido van Rossum13257902007-06-07 23:15:56 +0000117t = getattr(types, "CodeType", None)
118if t is not None:
119 d[t] = _copy_immutable
120for name in ("complex", "unicode"):
Antoine Pitroud6399d22010-09-04 17:46:44 +0000121 t = getattr(builtins, name, None)
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000122 if t is not None:
123 d[t] = _copy_immutable
Guido van Rossum409780f1995-01-10 00:34:21 +0000124
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000125def _copy_with_constructor(x):
126 return type(x)(x)
127for t in (list, dict, set):
128 d[t] = _copy_with_constructor
Guido van Rossum409780f1995-01-10 00:34:21 +0000129
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000130def _copy_with_copy_method(x):
Tim Peters88869f92001-01-14 23:36:06 +0000131 return x.copy()
Guido van Rossumf8baad02000-11-27 21:53:14 +0000132if PyStringMap is not None:
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000133 d[PyStringMap] = _copy_with_copy_method
Guido van Rossum409780f1995-01-10 00:34:21 +0000134
Guido van Rossum409780f1995-01-10 00:34:21 +0000135del d
136
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000137def deepcopy(x, memo=None, _nil=[]):
Tim Peters88869f92001-01-14 23:36:06 +0000138 """Deep copy operation on arbitrary Python objects.
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000139
Tim Peters88869f92001-01-14 23:36:06 +0000140 See the module's __doc__ string for more info.
141 """
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000142
Tim Peters88869f92001-01-14 23:36:06 +0000143 if memo is None:
144 memo = {}
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000145
Tim Peters88869f92001-01-14 23:36:06 +0000146 d = id(x)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000147 y = memo.get(d, _nil)
148 if y is not _nil:
149 return y
150
151 cls = type(x)
152
153 copier = _deepcopy_dispatch.get(cls)
154 if copier:
155 y = copier(x, memo)
156 else:
Tim Peters88869f92001-01-14 23:36:06 +0000157 try:
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000158 issc = issubclass(cls, type)
159 except TypeError: # cls is not a class (old Boost; see SF #502085)
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000160 issc = 0
161 if issc:
Guido van Rossume6908832003-02-19 01:19:28 +0000162 y = _deepcopy_atomic(x, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000163 else:
Guido van Rossume6908832003-02-19 01:19:28 +0000164 copier = getattr(x, "__deepcopy__", None)
165 if copier:
166 y = copier(memo)
167 else:
168 reductor = dispatch_table.get(cls)
169 if reductor:
170 rv = reductor(x)
171 else:
172 reductor = getattr(x, "__reduce_ex__", None)
173 if reductor:
174 rv = reductor(2)
175 else:
176 reductor = getattr(x, "__reduce__", None)
177 if reductor:
178 rv = reductor()
179 else:
180 raise Error(
181 "un(deep)copyable object of type %s" % cls)
182 y = _reconstruct(x, rv, 1, memo)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000183
Benjamin Petersone90ec362011-06-27 16:22:46 -0500184 # If is its own copy, don't memoize.
185 if y is not x:
186 memo[d] = y
187 _keep_alive(x, memo) # Make sure x lives at least as long as d
Tim Peters88869f92001-01-14 23:36:06 +0000188 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000189
190_deepcopy_dispatch = d = {}
191
192def _deepcopy_atomic(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000193 return x
Raymond Hettingerf7153662005-02-07 14:16:21 +0000194d[type(None)] = _deepcopy_atomic
Christian Heimescc47b052008-03-25 14:56:36 +0000195d[type(Ellipsis)] = _deepcopy_atomic
Raymond Hettingerf7153662005-02-07 14:16:21 +0000196d[int] = _deepcopy_atomic
Raymond Hettingerf7153662005-02-07 14:16:21 +0000197d[float] = _deepcopy_atomic
198d[bool] = _deepcopy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000199try:
Raymond Hettingerf7153662005-02-07 14:16:21 +0000200 d[complex] = _deepcopy_atomic
Martin v. Löwise2713be2005-03-08 15:03:08 +0000201except NameError:
Guido van Rossum8b9def32001-09-28 18:16:13 +0000202 pass
Guido van Rossum98297ee2007-11-06 21:34:58 +0000203d[bytes] = _deepcopy_atomic
Raymond Hettingerf7153662005-02-07 14:16:21 +0000204d[str] = _deepcopy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000205try:
Guido van Rossum88b666c2002-02-28 23:19:52 +0000206 d[types.CodeType] = _deepcopy_atomic
207except AttributeError:
208 pass
Raymond Hettingerf7153662005-02-07 14:16:21 +0000209d[type] = _deepcopy_atomic
Guido van Rossum805365e2007-05-07 22:24:25 +0000210d[range] = _deepcopy_atomic
Martin v. Löwisba8f5ff2003-06-14 07:10:06 +0000211d[types.BuiltinFunctionType] = _deepcopy_atomic
Guido van Rossum1968ad32006-02-25 22:38:04 +0000212d[types.FunctionType] = _deepcopy_atomic
Antoine Pitrou6e610062009-05-15 17:04:50 +0000213d[weakref.ref] = _deepcopy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +0000214
215def _deepcopy_list(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000216 y = []
217 memo[id(x)] = y
218 for a in x:
219 y.append(deepcopy(a, memo))
220 return y
Raymond Hettingerf7153662005-02-07 14:16:21 +0000221d[list] = _deepcopy_list
Guido van Rossum409780f1995-01-10 00:34:21 +0000222
223def _deepcopy_tuple(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000224 y = []
225 for a in x:
226 y.append(deepcopy(a, memo))
Benjamin Petersone90ec362011-06-27 16:22:46 -0500227 # We're not going to put the tuple in the memo, but it's still important we
228 # check for it, in case the tuple contains recursive mutable structures.
Tim Peters88869f92001-01-14 23:36:06 +0000229 try:
Benjamin Petersone90ec362011-06-27 16:22:46 -0500230 return memo[id(x)]
Tim Peters88869f92001-01-14 23:36:06 +0000231 except KeyError:
232 pass
233 for i in range(len(x)):
234 if x[i] is not y[i]:
235 y = tuple(y)
236 break
237 else:
238 y = x
Tim Peters88869f92001-01-14 23:36:06 +0000239 return y
Raymond Hettingerf7153662005-02-07 14:16:21 +0000240d[tuple] = _deepcopy_tuple
Guido van Rossum409780f1995-01-10 00:34:21 +0000241
242def _deepcopy_dict(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000243 y = {}
244 memo[id(x)] = y
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000245 for key, value in x.items():
Raymond Hettingere0d49722002-06-02 18:55:56 +0000246 y[deepcopy(key, memo)] = deepcopy(value, memo)
Tim Peters88869f92001-01-14 23:36:06 +0000247 return y
Raymond Hettingerf7153662005-02-07 14:16:21 +0000248d[dict] = _deepcopy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000249if PyStringMap is not None:
250 d[PyStringMap] = _deepcopy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000251
Antoine Pitrou1fc0d2b2009-11-28 15:58:27 +0000252def _deepcopy_method(x, memo): # Copy instance methods
253 return type(x)(x.__func__, deepcopy(x.__self__, memo))
254_deepcopy_dispatch[types.MethodType] = _deepcopy_method
255
Guido van Rossum558be281997-08-20 22:26:19 +0000256def _keep_alive(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000257 """Keeps a reference to the object x in the memo.
Guido van Rossum558be281997-08-20 22:26:19 +0000258
Tim Peters88869f92001-01-14 23:36:06 +0000259 Because we remember objects by their id, we have
260 to assure that possibly temporary objects are kept
261 alive by referencing them.
262 We store a reference at the id of the memo, which should
263 normally not be used unless someone tries to deepcopy
264 the memo itself...
265 """
266 try:
267 memo[id(memo)].append(x)
268 except KeyError:
269 # aha, this is the first one :-)
270 memo[id(memo)]=[x]
Guido van Rossum558be281997-08-20 22:26:19 +0000271
Guido van Rossum1e91c142001-12-28 21:33:22 +0000272def _reconstruct(x, info, deep, memo=None):
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000273 if isinstance(info, str):
274 return x
275 assert isinstance(info, tuple)
Guido van Rossum1e91c142001-12-28 21:33:22 +0000276 if memo is None:
277 memo = {}
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000278 n = len(info)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000279 assert n in (2, 3, 4, 5)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000280 callable, args = info[:2]
281 if n > 2:
282 state = info[2]
283 else:
284 state = {}
Guido van Rossum90e05b02003-02-06 18:18:23 +0000285 if n > 3:
286 listiter = info[3]
287 else:
288 listiter = None
289 if n > 4:
290 dictiter = info[4]
291 else:
292 dictiter = None
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000293 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000294 args = deepcopy(args, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000295 y = callable(*args)
Guido van Rossum99d2c252003-06-13 19:28:47 +0000296 memo[id(x)] = y
Antoine Pitrou3941a8f2010-09-04 17:40:21 +0000297
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000298 if state:
299 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000300 state = deepcopy(state, memo)
Guido van Rossum3e3583c2002-06-06 17:41:20 +0000301 if hasattr(y, '__setstate__'):
302 y.__setstate__(state)
303 else:
Guido van Rossumc7557582003-02-06 19:53:22 +0000304 if isinstance(state, tuple) and len(state) == 2:
305 state, slotstate = state
306 else:
307 slotstate = None
308 if state is not None:
309 y.__dict__.update(state)
310 if slotstate is not None:
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000311 for key, value in slotstate.items():
Guido van Rossumc7557582003-02-06 19:53:22 +0000312 setattr(y, key, value)
Antoine Pitrou3941a8f2010-09-04 17:40:21 +0000313
314 if listiter is not None:
315 for item in listiter:
316 if deep:
317 item = deepcopy(item, memo)
318 y.append(item)
319 if dictiter is not None:
320 for key, value in dictiter:
321 if deep:
322 key = deepcopy(key, memo)
323 value = deepcopy(value, memo)
324 y[key] = value
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000325 return y
326
Guido van Rossum409780f1995-01-10 00:34:21 +0000327del d
328
329del types
330
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000331# Helper for instance creation without calling __init__
332class _EmptyClass:
333 pass