Mercurial > cpython-lru_cache-weakref
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 |
| 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 | 167 issc = issubclass(type(x), type) |
| 168 except TypeError: | |
| 169 issc = 0 | |
| 170 if issc: | |
| 171 y = _deepcopy_dispatch[type](x, memo) | |
| 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 | 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 | 176 try: |
| 177 reductor = x.__reduce__ | |
| 178 except AttributeError: | |
| 179 raise error, \ | |
| 180 "un-deep-copyable object of type %s" % type(x) | |
| 181 else: | |
| 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 | 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 | 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 | 310 if hasattr(y, '__setstate__'): |
| 311 y.__setstate__(state) | |
| 312 else: | |
| 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() |
