annotate Lib/copy.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents c4715c9f442f
children
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
27733
e5e242cf46b1 Support all the new stuff supported by the new pickle code:
Guido van Rossum <guido@python.org>
parents: 27727
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
35068
abe5a5e39ccc SF bug #1219361 Fix typo
Raymond Hettinger <python@rcn.com>
parents: 34706
diff changeset
17 extent possible) inserts *the same objects* into it that the
2303
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
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 import types
54100
85fb4c229a9c Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 47088
diff changeset
52 import weakref
46867
dd5513b472dc Rename copy_reg module to copyreg.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 46084
diff changeset
53 from copyreg import dispatch_table
64436
f994e6fd0680 Merged revisions 84495-84497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
54 import builtins
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
55
14022
d44603f2b928 Convert some old-style string exceptions to class exceptions.
Fred Drake <fdrake@acm.org>
parents: 11708
diff changeset
56 class Error(Exception):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
57 pass
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
58 error = Error # backward compatibility
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
59
15437
d5f0696c37e8 Patch by Finn Bock to support PyStringMap in Jython.
Guido van Rossum <guido@python.org>
parents: 14449
diff changeset
60 try:
d5f0696c37e8 Patch by Finn Bock to support PyStringMap in Jython.
Guido van Rossum <guido@python.org>
parents: 14449
diff changeset
61 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
62 except ImportError:
d5f0696c37e8 Patch by Finn Bock to support PyStringMap in Jython.
Guido van Rossum <guido@python.org>
parents: 14449
diff changeset
63 PyStringMap = None
d5f0696c37e8 Patch by Finn Bock to support PyStringMap in Jython.
Guido van Rossum <guido@python.org>
parents: 14449
diff changeset
64
27733
e5e242cf46b1 Support all the new stuff supported by the new pickle code:
Guido van Rossum <guido@python.org>
parents: 27727
diff changeset
65 __all__ = ["Error", "copy", "deepcopy"]
16070
b5345e99596b added __all__ lists to a number of Python modules
Skip Montanaro <skip@pobox.com>
parents: 15867
diff changeset
66
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 def copy(x):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
68 """Shallow copy operation on arbitrary Python objects.
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
69
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
70 See the module's __doc__ string for more info.
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
71 """
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
72
27754
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
73 cls = type(x)
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
74
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
75 copier = _copy_dispatch.get(cls)
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
76 if copier:
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
77 return copier(x)
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
78
87681
c6bb6f304f75 Issue #11480: Fixed copy.copy to work with classes with custom metaclasses.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 71749
diff changeset
79 try:
c6bb6f304f75 Issue #11480: Fixed copy.copy to work with classes with custom metaclasses.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 71749
diff changeset
80 issc = issubclass(cls, type)
c6bb6f304f75 Issue #11480: Fixed copy.copy to work with classes with custom metaclasses.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 71749
diff changeset
81 except TypeError: # cls is not a class
c6bb6f304f75 Issue #11480: Fixed copy.copy to work with classes with custom metaclasses.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 71749
diff changeset
82 issc = False
c6bb6f304f75 Issue #11480: Fixed copy.copy to work with classes with custom metaclasses.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 71749
diff changeset
83 if issc:
c6bb6f304f75 Issue #11480: Fixed copy.copy to work with classes with custom metaclasses.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 71749
diff changeset
84 # treat it as a regular class:
c6bb6f304f75 Issue #11480: Fixed copy.copy to work with classes with custom metaclasses.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 71749
diff changeset
85 return _copy_immutable(x)
c6bb6f304f75 Issue #11480: Fixed copy.copy to work with classes with custom metaclasses.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 71749
diff changeset
86
27754
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
87 copier = getattr(cls, "__copy__", None)
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
88 if copier:
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
89 return copier(x)
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
90
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
91 reductor = dispatch_table.get(cls)
27959
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
92 if reductor:
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
93 rv = reductor(x)
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
94 else:
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
95 reductor = getattr(x, "__reduce_ex__", None)
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
96 if reductor:
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
97 rv = reductor(2)
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
98 else:
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
99 reductor = getattr(x, "__reduce__", None)
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
100 if reductor:
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
101 rv = reductor()
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
102 else:
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
103 raise Error("un(shallow)copyable object of type %s" % cls)
27754
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
104
27959
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
105 return _reconstruct(x, rv, 0)
27963
226463445697 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27960
diff changeset
106
27733
e5e242cf46b1 Support all the new stuff supported by the new pickle code:
Guido van Rossum <guido@python.org>
parents: 27727
diff changeset
107
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 _copy_dispatch = d = {}
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
109
31622
7080a0210cf1 Refactor the copy dispatcher code in copy.py. Simplifies and shortens
Raymond Hettinger <python@rcn.com>
parents: 29458
diff changeset
110 def _copy_immutable(x):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
111 return x
40961
e66ddb6e34e8 Remove duplicate refs to int from int/long unification presumably. (There might be more refs like these.)
Neal Norwitz <nnorwitz@gmail.com>
parents: 40809
diff changeset
112 for t in (type(None), int, float, bool, str, tuple,
41986
6464cc638faa Merged revisions 55795-55816 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41973
diff changeset
113 frozenset, type, range,
46084
6bea2f1351b1 Merged revisions 61834,61841-61842,61851-61853,61863-61864,61869-61870,61874,61889 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43777
diff changeset
114 types.BuiltinFunctionType, type(Ellipsis),
54100
85fb4c229a9c Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 47088
diff changeset
115 types.FunctionType, weakref.ref):
31622
7080a0210cf1 Refactor the copy dispatcher code in copy.py. Simplifies and shortens
Raymond Hettinger <python@rcn.com>
parents: 29458
diff changeset
116 d[t] = _copy_immutable
41986
6464cc638faa Merged revisions 55795-55816 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41973
diff changeset
117 t = getattr(types, "CodeType", None)
6464cc638faa Merged revisions 55795-55816 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41973
diff changeset
118 if t is not None:
6464cc638faa Merged revisions 55795-55816 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41973
diff changeset
119 d[t] = _copy_immutable
6464cc638faa Merged revisions 55795-55816 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41973
diff changeset
120 for name in ("complex", "unicode"):
64436
f994e6fd0680 Merged revisions 84495-84497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
121 t = getattr(builtins, name, None)
31622
7080a0210cf1 Refactor the copy dispatcher code in copy.py. Simplifies and shortens
Raymond Hettinger <python@rcn.com>
parents: 29458
diff changeset
122 if t is not None:
7080a0210cf1 Refactor the copy dispatcher code in copy.py. Simplifies and shortens
Raymond Hettinger <python@rcn.com>
parents: 29458
diff changeset
123 d[t] = _copy_immutable
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
124
31622
7080a0210cf1 Refactor the copy dispatcher code in copy.py. Simplifies and shortens
Raymond Hettinger <python@rcn.com>
parents: 29458
diff changeset
125 def _copy_with_constructor(x):
7080a0210cf1 Refactor the copy dispatcher code in copy.py. Simplifies and shortens
Raymond Hettinger <python@rcn.com>
parents: 29458
diff changeset
126 return type(x)(x)
7080a0210cf1 Refactor the copy dispatcher code in copy.py. Simplifies and shortens
Raymond Hettinger <python@rcn.com>
parents: 29458
diff changeset
127 for t in (list, dict, set):
7080a0210cf1 Refactor the copy dispatcher code in copy.py. Simplifies and shortens
Raymond Hettinger <python@rcn.com>
parents: 29458
diff changeset
128 d[t] = _copy_with_constructor
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
129
31622
7080a0210cf1 Refactor the copy dispatcher code in copy.py. Simplifies and shortens
Raymond Hettinger <python@rcn.com>
parents: 29458
diff changeset
130 def _copy_with_copy_method(x):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
131 return x.copy()
15437
d5f0696c37e8 Patch by Finn Bock to support PyStringMap in Jython.
Guido van Rossum <guido@python.org>
parents: 14449
diff changeset
132 if PyStringMap is not None:
31622
7080a0210cf1 Refactor the copy dispatcher code in copy.py. Simplifies and shortens
Raymond Hettinger <python@rcn.com>
parents: 29458
diff changeset
133 d[PyStringMap] = _copy_with_copy_method
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
134
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 del d
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
136
27754
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
137 def deepcopy(x, memo=None, _nil=[]):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
138 """Deep copy operation on arbitrary Python objects.
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
139
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
140 See the module's __doc__ string for more info.
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
141 """
2303
505fc478ff08 added __doc__ strings etc.
Guido van Rossum <guido@python.org>
parents: 2101
diff changeset
142
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
143 if memo is None:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
144 memo = {}
27754
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
145
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
146 d = id(x)
27754
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
147 y = memo.get(d, _nil)
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
148 if y is not _nil:
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
149 return y
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
150
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
151 cls = type(x)
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
152
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
153 copier = _deepcopy_dispatch.get(cls)
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
154 if copier:
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
155 y = copier(x, memo)
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
156 else:
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
157 try:
27754
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
158 issc = issubclass(cls, type)
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
159 except TypeError: # cls is not a class (old Boost; see SF #502085)
23768
4680ef4fe90a SF patch 560794 (Greg Chapman): deepcopy can't handle custom
Guido van Rossum <guido@python.org>
parents: 23705
diff changeset
160 issc = 0
4680ef4fe90a SF patch 560794 (Greg Chapman): deepcopy can't handle custom
Guido van Rossum <guido@python.org>
parents: 23705
diff changeset
161 if issc:
27959
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
162 y = _deepcopy_atomic(x, memo)
23768
4680ef4fe90a SF patch 560794 (Greg Chapman): deepcopy can't handle custom
Guido van Rossum <guido@python.org>
parents: 23705
diff changeset
163 else:
27959
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
164 copier = getattr(x, "__deepcopy__", None)
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
165 if copier:
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
166 y = copier(memo)
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
167 else:
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
168 reductor = dispatch_table.get(cls)
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
169 if reductor:
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
170 rv = reductor(x)
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
171 else:
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
172 reductor = getattr(x, "__reduce_ex__", None)
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
173 if reductor:
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
174 rv = reductor(2)
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
175 else:
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
176 reductor = getattr(x, "__reduce__", None)
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
177 if reductor:
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
178 rv = reductor()
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
179 else:
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
180 raise Error(
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
181 "un(deep)copyable object of type %s" % cls)
cc4ad9afa21d Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Guido van Rossum <guido@python.org>
parents: 27755
diff changeset
182 y = _reconstruct(x, rv, 1, memo)
27754
6b1789ac2f95 Add support for copy_reg.dispatch_table.
Guido van Rossum <guido@python.org>
parents: 27738
diff changeset
183
71018
e24ad85e9608 don't memoize objects that are their own copies (closes #12422)
Benjamin Peterson <benjamin@python.org>
parents: 68257
diff changeset
184 # If is its own copy, don't memoize.
e24ad85e9608 don't memoize objects that are their own copies (closes #12422)
Benjamin Peterson <benjamin@python.org>
parents: 68257
diff changeset
185 if y is not x:
e24ad85e9608 don't memoize objects that are their own copies (closes #12422)
Benjamin Peterson <benjamin@python.org>
parents: 68257
diff changeset
186 memo[d] = y
e24ad85e9608 don't memoize objects that are their own copies (closes #12422)
Benjamin Peterson <benjamin@python.org>
parents: 68257
diff changeset
187 _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
188 return y
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
189
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 _deepcopy_dispatch = d = {}
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
191
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 def _deepcopy_atomic(x, memo):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
193 return x
34551
028f92e44b48 Reduce the usage of the types module.
Raymond Hettinger <python@rcn.com>
parents: 31622
diff changeset
194 d[type(None)] = _deepcopy_atomic
46084
6bea2f1351b1 Merged revisions 61834,61841-61842,61851-61853,61863-61864,61869-61870,61874,61889 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43777
diff changeset
195 d[type(Ellipsis)] = _deepcopy_atomic
34551
028f92e44b48 Reduce the usage of the types module.
Raymond Hettinger <python@rcn.com>
parents: 31622
diff changeset
196 d[int] = _deepcopy_atomic
028f92e44b48 Reduce the usage of the types module.
Raymond Hettinger <python@rcn.com>
parents: 31622
diff changeset
197 d[float] = _deepcopy_atomic
028f92e44b48 Reduce the usage of the types module.
Raymond Hettinger <python@rcn.com>
parents: 31622
diff changeset
198 d[bool] = _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:
34551
028f92e44b48 Reduce the usage of the types module.
Raymond Hettinger <python@rcn.com>
parents: 31622
diff changeset
200 d[complex] = _deepcopy_atomic
34706
d687a8a09a72 Build with --disable-unicode again. Fixes #1158607.
Martin v. Löwis <martin@v.loewis.de>
parents: 34551
diff changeset
201 except NameError:
20153
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
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 41986
diff changeset
203 d[bytes] = _deepcopy_atomic
34551
028f92e44b48 Reduce the usage of the types module.
Raymond Hettinger <python@rcn.com>
parents: 31622
diff changeset
204 d[str] = _deepcopy_atomic
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 16070
diff changeset
205 try:
22135
9fdde8ccdca6 backport gvanrossum's checkin of
Michael W. Hudson <mwh@python.net>
parents: 21587
diff changeset
206 d[types.CodeType] = _deepcopy_atomic
9fdde8ccdca6 backport gvanrossum's checkin of
Michael W. Hudson <mwh@python.net>
parents: 21587
diff changeset
207 except AttributeError:
9fdde8ccdca6 backport gvanrossum's checkin of
Michael W. Hudson <mwh@python.net>
parents: 21587
diff changeset
208 pass
34551
028f92e44b48 Reduce the usage of the types module.
Raymond Hettinger <python@rcn.com>
parents: 31622
diff changeset
209 d[type] = _deepcopy_atomic
41642
a6eb6acfe04a Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41575
diff changeset
210 d[range] = _deepcopy_atomic
29458
8bed55203559 Copy builtin functions as atomic. Fixes #746304. Will backport to 2.2.
Martin v. Löwis <martin@v.loewis.de>
parents: 29435
diff changeset
211 d[types.BuiltinFunctionType] = _deepcopy_atomic
36656
92ce8bb8b12a - Patch 1433928:
Guido van Rossum <guido@python.org>
parents: 35068
diff changeset
212 d[types.FunctionType] = _deepcopy_atomic
54100
85fb4c229a9c Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 47088
diff changeset
213 d[weakref.ref] = _deepcopy_atomic
2101
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
34551
028f92e44b48 Reduce the usage of the types module.
Raymond Hettinger <python@rcn.com>
parents: 31622
diff changeset
221 d[list] = _deepcopy_list
2101
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))
71018
e24ad85e9608 don't memoize objects that are their own copies (closes #12422)
Benjamin Peterson <benjamin@python.org>
parents: 68257
diff changeset
227 # We're not going to put the tuple in the memo, but it's still important we
e24ad85e9608 don't memoize objects that are their own copies (closes #12422)
Benjamin Peterson <benjamin@python.org>
parents: 68257
diff changeset
228 # check for it, in case the tuple contains recursive mutable structures.
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
229 try:
71018
e24ad85e9608 don't memoize objects that are their own copies (closes #12422)
Benjamin Peterson <benjamin@python.org>
parents: 68257
diff changeset
230 return memo[id(x)]
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
231 except KeyError:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
232 pass
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
233 for i in range(len(x)):
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
234 if x[i] is not y[i]:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
235 y = tuple(y)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
236 break
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
237 else:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
238 y = x
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
239 return y
34551
028f92e44b48 Reduce the usage of the types module.
Raymond Hettinger <python@rcn.com>
parents: 31622
diff changeset
240 d[tuple] = _deepcopy_tuple
2101
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
40809
f340cb045bf9 - PEP 3106: dict.iterkeys(), .iteritems(), .itervalues() are now gone;
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
245 for key, value in x.items():
23634
dbee2f628a90 Replaced .keys() with dictionary iterators
Raymond Hettinger <python@rcn.com>
parents: 23620
diff changeset
246 y[deepcopy(key, memo)] = deepcopy(value, memo)
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
247 return y
34551
028f92e44b48 Reduce the usage of the types module.
Raymond Hettinger <python@rcn.com>
parents: 31622
diff changeset
248 d[dict] = _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
57496
916a3d350741 Merged revisions 76571 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
252 def _deepcopy_method(x, memo): # Copy instance methods
916a3d350741 Merged revisions 76571 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
253 return type(x)(x.__func__, deepcopy(x.__self__, memo))
916a3d350741 Merged revisions 76571 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
254 _deepcopy_dispatch[types.MethodType] = _deepcopy_method
916a3d350741 Merged revisions 76571 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
255
6116
07b7d4320b14 Make sure the objects returned by __getinitargs__() are kept alive (in
Guido van Rossum <guido@python.org>
parents: 5659
diff changeset
256 def _keep_alive(x, memo):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
257 """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
258
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
259 Because we remember objects by their id, we have
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
260 to assure that possibly temporary objects are kept
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
261 alive by referencing them.
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
262 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
263 normally not be used unless someone tries to deepcopy
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
264 the memo itself...
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
265 """
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
266 try:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
267 memo[id(memo)].append(x)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
268 except KeyError:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
269 # aha, this is the first one :-)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15437
diff changeset
270 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
271
21587
097ae0adf47f Fix for SF bug ##497426: can't deepcopy recursive new objects
Guido van Rossum <guido@python.org>
parents: 20153
diff changeset
272 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
273 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
274 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
275 assert isinstance(info, tuple)
21587
097ae0adf47f Fix for SF bug ##497426: can't deepcopy recursive new objects
Guido van Rossum <guido@python.org>
parents: 20153
diff changeset
276 if memo is None:
097ae0adf47f Fix for SF bug ##497426: can't deepcopy recursive new objects
Guido van Rossum <guido@python.org>
parents: 20153
diff changeset
277 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
278 n = len(info)
27727
d502187b2b06 Support __reduce__ returning a 4-tuple or 5-tuple.
Guido van Rossum <guido@python.org>
parents: 27262
diff changeset
279 assert n in (2, 3, 4, 5)
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
280 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
281 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
282 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
283 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
284 state = {}
27727
d502187b2b06 Support __reduce__ returning a 4-tuple or 5-tuple.
Guido van Rossum <guido@python.org>
parents: 27262
diff changeset
285 if n > 3:
d502187b2b06 Support __reduce__ returning a 4-tuple or 5-tuple.
Guido van Rossum <guido@python.org>
parents: 27262
diff changeset
286 listiter = info[3]
d502187b2b06 Support __reduce__ returning a 4-tuple or 5-tuple.
Guido van Rossum <guido@python.org>
parents: 27262
diff changeset
287 else:
d502187b2b06 Support __reduce__ returning a 4-tuple or 5-tuple.
Guido van Rossum <guido@python.org>
parents: 27262
diff changeset
288 listiter = None
d502187b2b06 Support __reduce__ returning a 4-tuple or 5-tuple.
Guido van Rossum <guido@python.org>
parents: 27262
diff changeset
289 if n > 4:
d502187b2b06 Support __reduce__ returning a 4-tuple or 5-tuple.
Guido van Rossum <guido@python.org>
parents: 27262
diff changeset
290 dictiter = info[4]
d502187b2b06 Support __reduce__ returning a 4-tuple or 5-tuple.
Guido van Rossum <guido@python.org>
parents: 27262
diff changeset
291 else:
d502187b2b06 Support __reduce__ returning a 4-tuple or 5-tuple.
Guido van Rossum <guido@python.org>
parents: 27262
diff changeset
292 dictiter = 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
293 if deep:
21587
097ae0adf47f Fix for SF bug ##497426: can't deepcopy recursive new objects
Guido van Rossum <guido@python.org>
parents: 20153
diff changeset
294 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
295 y = callable(*args)
29435
0ba7c101648a SF patch 707900, fixing bug 702858, by Steven Taschuk.
Guido van Rossum <guido@python.org>
parents: 28089
diff changeset
296 memo[id(x)] = y
64436
f994e6fd0680 Merged revisions 84495-84497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
297
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
298 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
299 if deep:
21587
097ae0adf47f Fix for SF bug ##497426: can't deepcopy recursive new objects
Guido van Rossum <guido@python.org>
parents: 20153
diff changeset
300 state = deepcopy(state, memo)
23705
f85f4531c3c1 Fix from SF patch 565085: copy._reduction doesn't __setstate__.
Guido van Rossum <guido@python.org>
parents: 23634
diff changeset
301 if hasattr(y, '__setstate__'):
f85f4531c3c1 Fix from SF patch 565085: copy._reduction doesn't __setstate__.
Guido van Rossum <guido@python.org>
parents: 23634
diff changeset
302 y.__setstate__(state)
f85f4531c3c1 Fix from SF patch 565085: copy._reduction doesn't __setstate__.
Guido van Rossum <guido@python.org>
parents: 23634
diff changeset
303 else:
27733
e5e242cf46b1 Support all the new stuff supported by the new pickle code:
Guido van Rossum <guido@python.org>
parents: 27727
diff changeset
304 if isinstance(state, tuple) and len(state) == 2:
e5e242cf46b1 Support all the new stuff supported by the new pickle code:
Guido van Rossum <guido@python.org>
parents: 27727
diff changeset
305 state, slotstate = state
e5e242cf46b1 Support all the new stuff supported by the new pickle code:
Guido van Rossum <guido@python.org>
parents: 27727
diff changeset
306 else:
e5e242cf46b1 Support all the new stuff supported by the new pickle code:
Guido van Rossum <guido@python.org>
parents: 27727
diff changeset
307 slotstate = None
e5e242cf46b1 Support all the new stuff supported by the new pickle code:
Guido van Rossum <guido@python.org>
parents: 27727
diff changeset
308 if state is not None:
e5e242cf46b1 Support all the new stuff supported by the new pickle code:
Guido van Rossum <guido@python.org>
parents: 27727
diff changeset
309 y.__dict__.update(state)
e5e242cf46b1 Support all the new stuff supported by the new pickle code:
Guido van Rossum <guido@python.org>
parents: 27727
diff changeset
310 if slotstate is not None:
40809
f340cb045bf9 - PEP 3106: dict.iterkeys(), .iteritems(), .itervalues() are now gone;
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
311 for key, value in slotstate.items():
27733
e5e242cf46b1 Support all the new stuff supported by the new pickle code:
Guido van Rossum <guido@python.org>
parents: 27727
diff changeset
312 setattr(y, key, value)
64436
f994e6fd0680 Merged revisions 84495-84497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
313
f994e6fd0680 Merged revisions 84495-84497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
314 if listiter is not None:
f994e6fd0680 Merged revisions 84495-84497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
315 for item in listiter:
f994e6fd0680 Merged revisions 84495-84497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
316 if deep:
f994e6fd0680 Merged revisions 84495-84497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
317 item = deepcopy(item, memo)
f994e6fd0680 Merged revisions 84495-84497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
318 y.append(item)
f994e6fd0680 Merged revisions 84495-84497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
319 if dictiter is not None:
f994e6fd0680 Merged revisions 84495-84497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
320 for key, value in dictiter:
f994e6fd0680 Merged revisions 84495-84497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
321 if deep:
f994e6fd0680 Merged revisions 84495-84497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
322 key = deepcopy(key, memo)
f994e6fd0680 Merged revisions 84495-84497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
323 value = deepcopy(value, memo)
f994e6fd0680 Merged revisions 84495-84497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54100
diff changeset
324 y[key] = value
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
325 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
326
2101
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
327 del d
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
328
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
329 del types
fdccc3222d0a shallow and deep copy operations
Guido van Rossum <guido@python.org>
parents:
diff changeset
330
6771
33e2145250af Apply the same change to classes without an __getinitargs__() method
Guido van Rossum <guido@python.org>
parents: 6527
diff changeset
331 # 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
332 class _EmptyClass:
33e2145250af Apply the same change to classes without an __getinitargs__() method
Guido van Rossum <guido@python.org>
parents: 6527
diff changeset
333 pass