Merged revisions 84495-84497 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.
........
  r84497 | antoine.pitrou | 2010-09-04 19:46:44 +0200 (sam., 04 sept. 2010) | 3 lines

  Fix running the copy module from the command-line (however use{ful,less} it may be).
........
This commit is contained in:
Antoine Pitrou 2010-09-04 17:49:13 +00:00
parent 5c78edae51
commit ce111caaeb
4 changed files with 49 additions and 13 deletions

View File

@ -51,6 +51,7 @@ __getstate__() and __setstate__(). See the documentation for module
import types import types
import weakref import weakref
from copyreg import dispatch_table from copyreg import dispatch_table
import builtins
class Error(Exception): class Error(Exception):
pass pass
@ -109,7 +110,7 @@ t = getattr(types, "CodeType", None)
if t is not None: if t is not None:
d[t] = _copy_immutable d[t] = _copy_immutable
for name in ("complex", "unicode"): for name in ("complex", "unicode"):
t = globals()['__builtins__'].get(name) t = getattr(builtins, name, None)
if t is not None: if t is not None:
d[t] = _copy_immutable d[t] = _copy_immutable
@ -279,17 +280,7 @@ def _reconstruct(x, info, deep, memo=None):
args = deepcopy(args, memo) args = deepcopy(args, memo)
y = callable(*args) y = callable(*args)
memo[id(x)] = y 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 state:
if deep: if deep:
state = deepcopy(state, memo) state = deepcopy(state, memo)
@ -305,6 +296,18 @@ def _reconstruct(x, info, deep, memo=None):
if slotstate is not None: if slotstate is not None:
for key, value in slotstate.items(): for key, value in slotstate.items():
setattr(y, key, value) 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 return y
del d del d
@ -366,6 +369,16 @@ def _test():
print(map(reprlib.repr, l1)) print(map(reprlib.repr, l1))
print(map(reprlib.repr, l2)) print(map(reprlib.repr, l2))
print(map(reprlib.repr, l3)) print(map(reprlib.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__': if __name__ == '__main__':
_test() _test()

View File

@ -532,6 +532,26 @@ class TestCopy(unittest.TestCase):
self.assertEqual(x.foo, y.foo) self.assertEqual(x.foo, y.foo)
self.assertTrue(x.foo is not 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())
super().__init__(d)
def __setitem__(self, key, item):
super().__setitem__(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): def test_copy_list_subclass(self):
class C(list): class C(list):
pass pass

View File

@ -469,7 +469,7 @@ Shawn Ligocki
Martin Ligr Martin Ligr
Grant Limberg Grant Limberg
Christopher Lindblad Christopher Lindblad
Bjorn Lindqvist Björn Lindqvist
Per Lindqvist Per Lindqvist
Eric Lindvall Eric Lindvall
Gregor Lingl Gregor Lingl

View File

@ -105,6 +105,9 @@ C-API
Library Library
------- -------
- Issue #1100562: Fix deep-copying of objects derived from the list and
dict types. Patch by Michele Orrù and Björn Lindqvist.
- Issue #9753: Fixed socket.dup, which did not always work correctly - Issue #9753: Fixed socket.dup, which did not always work correctly
on Windows. on Windows.