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:
parent
5c78edae51
commit
ce111caaeb
37
Lib/copy.py
37
Lib/copy.py
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue