Mercurial > cpython-lru_cache-weakref
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 |
| 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 | 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 |
