diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2010-09-04 17:52:26 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2010-09-04 17:52:26 (GMT) |
commit | dca9de97b4256c8aad8a423d6f1d889d2bae9b3d (patch) | |
tree | a3bad4b9e4b5fe279288df47c64f569ab991e2c4 /Lib | |
parent | dd806cef090256f88dfe0ad88bdcba200be4cb78 (diff) | |
download | cpython-dca9de97b4256c8aad8a423d6f1d889d2bae9b3d.zip cpython-dca9de97b4256c8aad8a423d6f1d889d2bae9b3d.tar.gz cpython-dca9de97b4256c8aad8a423d6f1d889d2bae9b3d.tar.bz2 |
Merged revisions 84495-84496 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r84495 | antoine.pitrou | 2010-09-04 19:40:21 +0200 (sam., 04 sept. 2010) | 4 lines
Issue #1100562: Fix deep-copying of objects derived from the list and dict types.
Patch by Michele Orrù and Björn Lindqvist.
........
r84496 | antoine.pitrou | 2010-09-04 19:40:51 +0200 (sam., 04 sept. 2010) | 3 lines
Fix Björn's name in ACKS.
........
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/copy.py | 34 | ||||
-rw-r--r-- | Lib/test/test_copy.py | 20 |
2 files changed, 43 insertions, 11 deletions
diff --git a/Lib/copy.py b/Lib/copy.py index bbbd5b3..c227a2e 100644 --- a/Lib/copy.py +++ b/Lib/copy.py @@ -328,17 +328,7 @@ def _reconstruct(x, info, deep, memo=None): args = deepcopy(args, memo) y = callable(*args) memo[id(x)] = y - if listiter is not None: - for item in listiter: - if deep: - item = deepcopy(item, memo) - y.append(item) - if dictiter is not None: - for key, value in dictiter: - if deep: - key = deepcopy(key, memo) - value = deepcopy(value, memo) - y[key] = value + if state: if deep: state = deepcopy(state, memo) @@ -354,6 +344,18 @@ def _reconstruct(x, info, deep, memo=None): if slotstate is not None: for key, value in slotstate.iteritems(): setattr(y, key, value) + + if listiter is not None: + for item in listiter: + if deep: + item = deepcopy(item, memo) + y.append(item) + if dictiter is not None: + for key, value in dictiter: + if deep: + key = deepcopy(key, memo) + value = deepcopy(value, memo) + y[key] = value return y del d @@ -416,6 +418,16 @@ def _test(): print map(repr.repr, l1) print map(repr.repr, l2) print map(repr.repr, l3) + class odict(dict): + def __init__(self, d = {}): + self.a = 99 + dict.__init__(self, d) + def __setitem__(self, k, i): + dict.__setitem__(self, k, i) + self.a + o = odict({"A" : "B"}) + x = deepcopy(o) + print(o, x) if __name__ == '__main__': _test() diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py index e3503c4..6b64f10 100644 --- a/Lib/test/test_copy.py +++ b/Lib/test/test_copy.py @@ -526,6 +526,26 @@ class TestCopy(unittest.TestCase): self.assertEqual(x.foo, y.foo) self.assertTrue(x.foo is not y.foo) + def test_deepcopy_dict_subclass(self): + class C(dict): + def __init__(self, d=None): + if not d: + d = {} + self._keys = list(d.keys()) + dict.__init__(self, d) + def __setitem__(self, key, item): + dict.__setitem__(self, key, item) + if key not in self._keys: + self._keys.append(key) + x = C(d={'foo':0}) + y = copy.deepcopy(x) + self.assertEqual(x, y) + self.assertEqual(x._keys, y._keys) + self.assertTrue(x is not y) + x['bar'] = 1 + self.assertNotEqual(x, y) + self.assertNotEqual(x._keys, y._keys) + def test_copy_list_subclass(self): class C(list): pass |