annotate Lib/copy.py @ 25838:8540887bcec6 2.2

Backport of 2.183: Fix memory leak in add_subclass() found by NealN with valgrind.
author Guido van Rossum <guido@python.org>
date Fri, 18 Oct 2002 13:42:21 +0000
parents acb258545a5c
children 21bfcb7c976d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11708
4a23cc49e2b0 Actually, the previous batch's comment should have been different;
Guido van Rossum <guido@python.org>
parents: 9945
diff changeset
1 """Generic (shallow and deep) copying operations.
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
2
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
3 Interface summary:
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
4
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
5 import copy
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
6
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
7 x = copy.copy(y) # make a shallow copy of y
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
8 x = copy.deepcopy(y) # make a deep copy of y
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
9
2540
d7ae5fb1d255 rename copy.Error to copy.error
Guido van Rossum <guido@python.org>
parents: 2303
diff changeset
10 For module specific errors, copy.error is raised.
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
11
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
12 The difference between shallow and deep copying is only relevant for
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
13 compound objects (objects that contain other objects, like lists or
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
14 class instances).
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
15
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
16 - A shallow copy constructs a new compound object and then (to the
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
17 extent possible) inserts *the same objects* into in that the
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
18 original contains.
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
19
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
20 - A deep copy constructs a new compound object and then, recursively,
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
21 inserts *copies* into it of the objects found in the original.
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
22
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
23 Two problems often exist with deep copy operations that don't exist
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
24 with shallow copy operations:
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
25
5659
6f9a2c874018 Remove '(' in column 0 of doc strings.
Guido van Rossum <guido@python.org>
parents: 3685
diff changeset
26 a) recursive objects (compound objects that, directly or indirectly,
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
27 contain a reference to themselves) may cause a recursive loop
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
28
5659
6f9a2c874018 Remove '(' in column 0 of doc strings.
Guido van Rossum <guido@python.org>
parents: 3685
diff changeset
29 b) because deep copy copies *everything* it may copy too much, e.g.
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
30 administrative data structures that should be shared even between
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
31 copies
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
32
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
33 Python's deep copy operation avoids these problems by:
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
34
5659
6f9a2c874018 Remove '(' in column 0 of doc strings.
Guido van Rossum <guido@python.org>
parents: 3685
diff changeset
35 a) keeping a table of objects already copied during the current
6f9a2c874018 Remove '(' in column 0 of doc strings.
Guido van Rossum <guido@python.org>
parents: 3685
diff changeset
36 copying pass
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
37
5659
6f9a2c874018 Remove '(' in column 0 of doc strings.
Guido van Rossum <guido@python.org>
parents: 3685
diff changeset
38 b) letting user-defined classes override the copying operation or the
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
39 set of components copied
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
40
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
41 This version does not copy types like module, class, function, method,
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
42 nor stack trace, stack frame, nor file, socket, window, nor array, nor
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
43 any similar types.
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
44
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
45 Classes can use the same interfaces to control copying that they use
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
46 to control pickling: they can define methods called __getinitargs__(),
6771
33e2145250af Apply the same change to classes without an __getinitargs__() method
Guido van Rossum <guido@python.org>
parents: 6527
diff changeset
47 __getstate__() and __setstate__(). See the documentation for module
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
48 "pickle" for information on these methods.
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
49 """
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
50
6424
aaca47ef55a8 Add XXX note about wanting support for copy_reg.py...
Guido van Rossum <guido@python.org>
parents: 6116
diff changeset
51 # XXX need to support copy_reg here too...
aaca47ef55a8 Add XXX note about wanting support for copy_reg.py...
Guido van Rossum <guido@python.org>
parents: 6116
diff changeset
52
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 import types
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
54
14022
d44603f2b928 Convert some old-style string exceptions to class exceptions.
Fred Drake <fdrake@acm.org>
parents: 11708
diff changeset
55 class Error(Exception):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
56 pass
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
57 error = Error # backward compatibility
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
58
15437
d5f0696c37e8 Patch by Finn Bock to support PyStringMap in Jython.
Guido van Rossum <guido@python.org>
parents: 14449
diff changeset
59 try:
d5f0696c37e8 Patch by Finn Bock to support PyStringMap in Jython.
Guido van Rossum <guido@python.org>
parents: 14449
diff changeset
60 from org.python.core import PyStringMap
d5f0696c37e8 Patch by Finn Bock to support PyStringMap in Jython.
Guido van Rossum <guido@python.org>
parents: 14449
diff changeset
61 except ImportError:
d5f0696c37e8 Patch by Finn Bock to support PyStringMap in Jython.
Guido van Rossum <guido@python.org>
parents: 14449
diff changeset
62 PyStringMap = None
d5f0696c37e8 Patch by Finn Bock to support PyStringMap in Jython.
Guido van Rossum <guido@python.org>
parents: 14449
diff changeset
63
20152
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
64 __all__ = ["Error", "error", "copy", "deepcopy"]
16070
b5345e99596b added __all__ lists to a number of Python modules
Skip Montanaro <skip@pobox.com>
parents: 15867
diff changeset
65
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 def copy(x):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
67 """Shallow copy operation on arbitrary Python objects.
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
68
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
69 See the module's __doc__ string for more info.
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
70 """
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
71
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
72 try:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
73 copierfunction = _copy_dispatch[type(x)]
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
74 except KeyError:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
75 try:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
76 copier = x.__copy__
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
77 except AttributeError:
20152
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
78 try:
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
79 reductor = x.__reduce__
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
80 except AttributeError:
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
81 raise error, \
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
82 "un(shallow)copyable object of type %s" % type(x)
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
83 else:
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
84 y = _reconstruct(x, reductor(), 0)
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
85 else:
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
86 y = copier()
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
87 else:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
88 y = copierfunction(x)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
89 return y
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
90
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 _copy_dispatch = d = {}
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
92
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 def _copy_atomic(x):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
94 return x
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 d[types.NoneType] = _copy_atomic
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 d[types.IntType] = _copy_atomic
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 d[types.LongType] = _copy_atomic
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 d[types.FloatType] = _copy_atomic
20153
c68ef47b1709 Add complex to the dispatch tables, to avoid going through the whole
Guido van Rossum <guido@python.org>
parents: 20152
diff changeset
99 try:
c68ef47b1709 Add complex to the dispatch tables, to avoid going through the whole
Guido van Rossum <guido@python.org>
parents: 20152
diff changeset
100 d[types.ComplexType] = _copy_atomic
c68ef47b1709 Add complex to the dispatch tables, to avoid going through the whole
Guido van Rossum <guido@python.org>
parents: 20152
diff changeset
101 except AttributeError:
c68ef47b1709 Add complex to the dispatch tables, to avoid going through the whole
Guido van Rossum <guido@python.org>
parents: 20152
diff changeset
102 pass
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 d[types.StringType] = _copy_atomic
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 16070
diff changeset
104 try:
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 16070
diff changeset
105 d[types.UnicodeType] = _copy_atomic
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 16070
diff changeset
106 except AttributeError:
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 16070
diff changeset
107 pass
9945
c39c4bc45d39 Don't die if CodeType doesn't exist -- ignore the error. This could
Guido van Rossum <guido@python.org>
parents: 7752
diff changeset
108 try:
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
109 d[types.CodeType] = _copy_atomic
9945
c39c4bc45d39 Don't die if CodeType doesn't exist -- ignore the error. This could
Guido van Rossum <guido@python.org>
parents: 7752
diff changeset
110 except AttributeError:
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
111 pass
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 d[types.TypeType] = _copy_atomic
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 d[types.XRangeType] = _copy_atomic
2540
d7ae5fb1d255 rename copy.Error to copy.error
Guido van Rossum <guido@python.org>
parents: 2303
diff changeset
114 d[types.ClassType] = _copy_atomic
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
115
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 def _copy_list(x):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
117 return x[:]
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 d[types.ListType] = _copy_list
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
119
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 def _copy_tuple(x):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
121 return x[:]
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 d[types.TupleType] = _copy_tuple
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
123
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 def _copy_dict(x):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
125 return x.copy()
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 d[types.DictionaryType] = _copy_dict
15437
d5f0696c37e8 Patch by Finn Bock to support PyStringMap in Jython.
Guido van Rossum <guido@python.org>
parents: 14449
diff changeset
127 if PyStringMap is not None:
d5f0696c37e8 Patch by Finn Bock to support PyStringMap in Jython.
Guido van Rossum <guido@python.org>
parents: 14449
diff changeset
128 d[PyStringMap] = _copy_dict
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
129
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 def _copy_inst(x):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
131 if hasattr(x, '__copy__'):
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
132 return x.__copy__()
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
133 if hasattr(x, '__getinitargs__'):
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
134 args = x.__getinitargs__()
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
135 y = apply(x.__class__, args)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
136 else:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
137 y = _EmptyClass()
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
138 y.__class__ = x.__class__
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
139 if hasattr(x, '__getstate__'):
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
140 state = x.__getstate__()
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
141 else:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
142 state = x.__dict__
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
143 if hasattr(y, '__setstate__'):
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
144 y.__setstate__(state)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
145 else:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
146 y.__dict__.update(state)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
147 return y
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 d[types.InstanceType] = _copy_inst
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
149
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 del d
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
151
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
152 def deepcopy(x, memo = None):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
153 """Deep copy operation on arbitrary Python objects.
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
154
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
155 See the module's __doc__ string for more info.
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
156 """
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
157
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
158 if memo is None:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
159 memo = {}
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
160 d = id(x)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
161 if memo.has_key(d):
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
162 return memo[d]
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
163 try:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
164 copierfunction = _deepcopy_dispatch[type(x)]
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
165 except KeyError:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
166 try:
23769
35b6290855fc Backport:
Guido van Rossum <guido@python.org>
parents: 23707
diff changeset
167 issc = issubclass(type(x), type)
35b6290855fc Backport:
Guido van Rossum <guido@python.org>
parents: 23707
diff changeset
168 except TypeError:
35b6290855fc Backport:
Guido van Rossum <guido@python.org>
parents: 23707
diff changeset
169 issc = 0
35b6290855fc Backport:
Guido van Rossum <guido@python.org>
parents: 23707
diff changeset
170 if issc:
35b6290855fc Backport:
Guido van Rossum <guido@python.org>
parents: 23707
diff changeset
171 y = _deepcopy_dispatch[type](x, memo)
35b6290855fc Backport:
Guido van Rossum <guido@python.org>
parents: 23707
diff changeset
172 else:
20152
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
173 try:
23769
35b6290855fc Backport:
Guido van Rossum <guido@python.org>
parents: 23707
diff changeset
174 copier = x.__deepcopy__
20152
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
175 except AttributeError:
23769
35b6290855fc Backport:
Guido van Rossum <guido@python.org>
parents: 23707
diff changeset
176 try:
35b6290855fc Backport:
Guido van Rossum <guido@python.org>
parents: 23707
diff changeset
177 reductor = x.__reduce__
35b6290855fc Backport:
Guido van Rossum <guido@python.org>
parents: 23707
diff changeset
178 except AttributeError:
35b6290855fc Backport:
Guido van Rossum <guido@python.org>
parents: 23707
diff changeset
179 raise error, \
35b6290855fc Backport:
Guido van Rossum <guido@python.org>
parents: 23707
diff changeset
180 "un-deep-copyable object of type %s" % type(x)
35b6290855fc Backport:
Guido van Rossum <guido@python.org>
parents: 23707
diff changeset
181 else:
35b6290855fc Backport:
Guido van Rossum <guido@python.org>
parents: 23707
diff changeset
182 y = _reconstruct(x, reductor(), 1, memo)
20152
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
183 else:
23769
35b6290855fc Backport:
Guido van Rossum <guido@python.org>
parents: 23707
diff changeset
184 y = copier(memo)
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
185 else:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
186 y = copierfunction(x, memo)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
187 memo[d] = y
24768
acb258545a5c Backport:
Guido van Rossum <guido@python.org>
parents: 23769
diff changeset
188 _keep_alive(x, memo) # Make sure x lives at least as long as d
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
189 return y
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
190
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 _deepcopy_dispatch = d = {}
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
192
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 def _deepcopy_atomic(x, memo):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
194 return x
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 d[types.NoneType] = _deepcopy_atomic
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 d[types.IntType] = _deepcopy_atomic
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 d[types.LongType] = _deepcopy_atomic
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 d[types.FloatType] = _deepcopy_atomic
20153
c68ef47b1709 Add complex to the dispatch tables, to avoid going through the whole
Guido van Rossum <guido@python.org>
parents: 20152
diff changeset
199 try:
c68ef47b1709 Add complex to the dispatch tables, to avoid going through the whole
Guido van Rossum <guido@python.org>
parents: 20152
diff changeset
200 d[types.ComplexType] = _deepcopy_atomic
c68ef47b1709 Add complex to the dispatch tables, to avoid going through the whole
Guido van Rossum <guido@python.org>
parents: 20152
diff changeset
201 except AttributeError:
c68ef47b1709 Add complex to the dispatch tables, to avoid going through the whole
Guido van Rossum <guido@python.org>
parents: 20152
diff changeset
202 pass
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 d[types.StringType] = _deepcopy_atomic
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 16070
diff changeset
204 try:
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 16070
diff changeset
205 d[types.UnicodeType] = _deepcopy_atomic
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 16070
diff changeset
206 except AttributeError:
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 16070
diff changeset
207 pass
22135
9fdde8ccdca6 backport gvanrossum's checkin of
Michael W. Hudson <mwh@python.net>
parents: 21628
diff changeset
208 try:
9fdde8ccdca6 backport gvanrossum's checkin of
Michael W. Hudson <mwh@python.net>
parents: 21628
diff changeset
209 d[types.CodeType] = _deepcopy_atomic
9fdde8ccdca6 backport gvanrossum's checkin of
Michael W. Hudson <mwh@python.net>
parents: 21628
diff changeset
210 except AttributeError:
9fdde8ccdca6 backport gvanrossum's checkin of
Michael W. Hudson <mwh@python.net>
parents: 21628
diff changeset
211 pass
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 d[types.TypeType] = _deepcopy_atomic
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 d[types.XRangeType] = _deepcopy_atomic
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
214
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 def _deepcopy_list(x, memo):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
216 y = []
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
217 memo[id(x)] = y
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
218 for a in x:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
219 y.append(deepcopy(a, memo))
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
220 return y
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 d[types.ListType] = _deepcopy_list
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
222
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 def _deepcopy_tuple(x, memo):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
224 y = []
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
225 for a in x:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
226 y.append(deepcopy(a, memo))
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
227 d = id(x)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
228 try:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
229 return memo[d]
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
230 except KeyError:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
231 pass
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
232 for i in range(len(x)):
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
233 if x[i] is not y[i]:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
234 y = tuple(y)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
235 break
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
236 else:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
237 y = x
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
238 memo[d] = y
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
239 return y
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
240 d[types.TupleType] = _deepcopy_tuple
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
241
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
242 def _deepcopy_dict(x, memo):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
243 y = {}
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
244 memo[id(x)] = y
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
245 for key in x.keys():
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
246 y[deepcopy(key, memo)] = deepcopy(x[key], memo)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
247 return y
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 d[types.DictionaryType] = _deepcopy_dict
15437
d5f0696c37e8 Patch by Finn Bock to support PyStringMap in Jython.
Guido van Rossum <guido@python.org>
parents: 14449
diff changeset
249 if PyStringMap is not None:
d5f0696c37e8 Patch by Finn Bock to support PyStringMap in Jython.
Guido van Rossum <guido@python.org>
parents: 14449
diff changeset
250 d[PyStringMap] = _deepcopy_dict
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
251
6116
07b7d4320b14 Make sure the objects returned by __getinitargs__() are kept alive (in
Guido van Rossum <guido@python.org>
parents: 5659
diff changeset
252 def _keep_alive(x, memo):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
253 """Keeps a reference to the object x in the memo.
6116
07b7d4320b14 Make sure the objects returned by __getinitargs__() are kept alive (in
Guido van Rossum <guido@python.org>
parents: 5659
diff changeset
254
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
255 Because we remember objects by their id, we have
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
256 to assure that possibly temporary objects are kept
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
257 alive by referencing them.
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
258 We store a reference at the id of the memo, which should
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
259 normally not be used unless someone tries to deepcopy
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
260 the memo itself...
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
261 """
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
262 try:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
263 memo[id(memo)].append(x)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
264 except KeyError:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
265 # aha, this is the first one :-)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
266 memo[id(memo)]=[x]
6116
07b7d4320b14 Make sure the objects returned by __getinitargs__() are kept alive (in
Guido van Rossum <guido@python.org>
parents: 5659
diff changeset
267
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
268 def _deepcopy_inst(x, memo):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
269 if hasattr(x, '__deepcopy__'):
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
270 return x.__deepcopy__(memo)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
271 if hasattr(x, '__getinitargs__'):
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
272 args = x.__getinitargs__()
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
273 args = deepcopy(args, memo)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
274 y = apply(x.__class__, args)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
275 else:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
276 y = _EmptyClass()
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
277 y.__class__ = x.__class__
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
278 memo[id(x)] = y
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
279 if hasattr(x, '__getstate__'):
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
280 state = x.__getstate__()
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
281 else:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
282 state = x.__dict__
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
283 state = deepcopy(state, memo)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
284 if hasattr(y, '__setstate__'):
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
285 y.__setstate__(state)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
286 else:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
287 y.__dict__.update(state)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
288 return y
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
289 d[types.InstanceType] = _deepcopy_inst
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
290
21628
6d4288e8918b Backport gvanrossum's checkin of revisions
Michael W. Hudson <mwh@python.net>
parents: 20153
diff changeset
291 def _reconstruct(x, info, deep, memo=None):
20152
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
292 if isinstance(info, str):
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
293 return x
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
294 assert isinstance(info, tuple)
21628
6d4288e8918b Backport gvanrossum's checkin of revisions
Michael W. Hudson <mwh@python.net>
parents: 20153
diff changeset
295 if memo is None:
6d4288e8918b Backport gvanrossum's checkin of revisions
Michael W. Hudson <mwh@python.net>
parents: 20153
diff changeset
296 memo = {}
20152
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
297 n = len(info)
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
298 assert n in (2, 3)
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
299 callable, args = info[:2]
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
300 if n > 2:
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
301 state = info[2]
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
302 else:
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
303 state = {}
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
304 if deep:
21628
6d4288e8918b Backport gvanrossum's checkin of revisions
Michael W. Hudson <mwh@python.net>
parents: 20153
diff changeset
305 args = deepcopy(args, memo)
20152
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
306 y = callable(*args)
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
307 if state:
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
308 if deep:
21628
6d4288e8918b Backport gvanrossum's checkin of revisions
Michael W. Hudson <mwh@python.net>
parents: 20153
diff changeset
309 state = deepcopy(state, memo)
23707
058bd2d50e33 Backport:
Guido van Rossum <guido@python.org>
parents: 22135
diff changeset
310 if hasattr(y, '__setstate__'):
058bd2d50e33 Backport:
Guido van Rossum <guido@python.org>
parents: 22135
diff changeset
311 y.__setstate__(state)
058bd2d50e33 Backport:
Guido van Rossum <guido@python.org>
parents: 22135
diff changeset
312 else:
058bd2d50e33 Backport:
Guido van Rossum <guido@python.org>
parents: 22135
diff changeset
313 y.__dict__.update(state)
20152
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
314 return y
72a5347d2f9a Changes to copy() and deepcopy() in copy.py to support __reduce__ as a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
315
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
316 del d
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
317
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
318 del types
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
319
6771
33e2145250af Apply the same change to classes without an __getinitargs__() method
Guido van Rossum <guido@python.org>
parents: 6527
diff changeset
320 # Helper for instance creation without calling __init__
33e2145250af Apply the same change to classes without an __getinitargs__() method
Guido van Rossum <guido@python.org>
parents: 6527
diff changeset
321 class _EmptyClass:
33e2145250af Apply the same change to classes without an __getinitargs__() method
Guido van Rossum <guido@python.org>
parents: 6527
diff changeset
322 pass
33e2145250af Apply the same change to classes without an __getinitargs__() method
Guido van Rossum <guido@python.org>
parents: 6527
diff changeset
323
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
324 def _test():
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
325 l = [None, 1, 2L, 3.14, 'xyzzy', (1, 2L), [3.14, 'abc'],
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
326 {'abc': 'ABC'}, (), [], {}]
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
327 l1 = copy(l)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
328 print l1==l
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
329 l1 = map(copy, l)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
330 print l1==l
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
331 l1 = deepcopy(l)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
332 print l1==l
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
333 class C:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
334 def __init__(self, arg=None):
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
335 self.a = 1
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
336 self.arg = arg
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
337 if __name__ == '__main__':
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
338 import sys
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
339 file = sys.argv[0]
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
340 else:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
341 file = __file__
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
342 self.fp = open(file)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
343 self.fp.close()
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
344 def __getstate__(self):
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
345 return {'a': self.a, 'arg': self.arg}
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
346 def __setstate__(self, state):
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
347 for key in state.keys():
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
348 setattr(self, key, state[key])
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
349 def __deepcopy__(self, memo = None):
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
350 new = self.__class__(deepcopy(self.arg, memo))
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
351 new.a = self.a
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
352 return new
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
353 c = C('argument sketch')
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
354 l.append(c)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
355 l2 = copy(l)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
356 print l == l2
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
357 print l
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
358 print l2
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
359 l2 = deepcopy(l)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
360 print l == l2
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
361 print l
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
362 print l2
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
363 l.append({l[1]: l, 'xyz': l[2]})
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
364 l3 = copy(l)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
365 import repr
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
366 print map(repr.repr, l)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
367 print map(repr.repr, l1)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
368 print map(repr.repr, l2)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
369 print map(repr.repr, l3)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
370 l3 = deepcopy(l)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
371 import repr
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
372 print map(repr.repr, l)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
373 print map(repr.repr, l1)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
374 print map(repr.repr, l2)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
375 print map(repr.repr, l3)
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
376
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
377 if __name__ == '__main__':
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
378 _test()