Fix for SF bug ##497426: can't deepcopy recursive new objects
deepcopy(), _reconstruct(): pass the memo to the other function, so that recursive data structures built out of new-style objects may be deeply copied correctly. 2.2.1 bugfix!
This commit is contained in:
parent
1baeba6839
commit
1e91c1444a
10
Lib/copy.py
10
Lib/copy.py
|
@ -172,7 +172,7 @@ def deepcopy(x, memo = None):
|
|||
raise error, \
|
||||
"un-deep-copyable object of type %s" % type(x)
|
||||
else:
|
||||
y = _reconstruct(x, reductor(), 1)
|
||||
y = _reconstruct(x, reductor(), 1, memo)
|
||||
else:
|
||||
y = copier(memo)
|
||||
else:
|
||||
|
@ -279,10 +279,12 @@ def _deepcopy_inst(x, memo):
|
|||
return y
|
||||
d[types.InstanceType] = _deepcopy_inst
|
||||
|
||||
def _reconstruct(x, info, deep):
|
||||
def _reconstruct(x, info, deep, memo=None):
|
||||
if isinstance(info, str):
|
||||
return x
|
||||
assert isinstance(info, tuple)
|
||||
if memo is None:
|
||||
memo = {}
|
||||
n = len(info)
|
||||
assert n in (2, 3)
|
||||
callable, args = info[:2]
|
||||
|
@ -291,11 +293,11 @@ def _reconstruct(x, info, deep):
|
|||
else:
|
||||
state = {}
|
||||
if deep:
|
||||
args = deepcopy(args)
|
||||
args = deepcopy(args, memo)
|
||||
y = callable(*args)
|
||||
if state:
|
||||
if deep:
|
||||
state = deepcopy(state)
|
||||
state = deepcopy(state, memo)
|
||||
y.__dict__.update(state)
|
||||
return y
|
||||
|
||||
|
|
Loading…
Reference in New Issue