14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""Unit tests for the copy module.""" 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport copy 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport copy_reg 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport weakref 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test import test_support 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestCopy(unittest.TestCase): 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Attempt full line coverage of copy.py from top to bottom 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_exceptions(self): 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(copy.Error is copy.error) 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(copy.Error, Exception)) 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # The copy() method 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_basic(self): 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = 42 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.copy(x) 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(x, y) 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_copy(self): 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, foo): 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = foo 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __copy__(self): 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return C(self.foo) 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C(42) 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.copy(x) 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y.__class__, x.__class__) 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y.foo, x.foo) 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_registry(self): 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __new__(cls, foo): 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj = object.__new__(cls) 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj.foo = foo 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return obj 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def pickle_C(obj): 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (C, (obj.foo,)) 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C(42) 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, copy.copy, x) 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm copy_reg.pickle(C, pickle_C, C) 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.copy(x) 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_reduce_ex(self): 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __reduce_ex__(self, proto): 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return "" 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __reduce__(self): 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise test_support.TestFailed, "shouldn't call this" 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C() 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.copy(x) 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is x) 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_reduce(self): 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __reduce__(self): 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return "" 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C() 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.copy(x) 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is x) 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_cant(self): 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getattribute__(self, name): 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if name.startswith("__reduce"): 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise AttributeError, name 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return object.__getattribute__(self, name) 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C() 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(copy.Error, copy.copy, x) 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Type-specific _copy_xxx() methods 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_atomic(self): 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Classic: 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class NewStyle(object): 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def f(): 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tests = [None, 42, 2L**100, 3.14, True, False, 1j, 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "hello", u"hello\u1234", f.func_code, 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm NewStyle, xrange(10), Classic, max] 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for x in tests: 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(copy.copy(x) is x, repr(x)) 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_list(self): 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = [1, 2, 3] 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(copy.copy(x), x) 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_tuple(self): 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = (1, 2, 3) 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(copy.copy(x), x) 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_dict(self): 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = {"foo": 1, "bar": 2} 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(copy.copy(x), x) 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_inst_vanilla(self): 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C: 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, foo): 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = foo 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __cmp__(self, other): 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return cmp(self.foo, other.foo) 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C(42) 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(copy.copy(x), x) 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_inst_copy(self): 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C: 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, foo): 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = foo 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __copy__(self): 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return C(self.foo) 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __cmp__(self, other): 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return cmp(self.foo, other.foo) 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C(42) 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(copy.copy(x), x) 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_inst_getinitargs(self): 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C: 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, foo): 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = foo 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getinitargs__(self): 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (self.foo,) 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __cmp__(self, other): 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return cmp(self.foo, other.foo) 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C(42) 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(copy.copy(x), x) 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_inst_getstate(self): 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C: 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, foo): 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = foo 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getstate__(self): 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return {"foo": self.foo} 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __cmp__(self, other): 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return cmp(self.foo, other.foo) 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C(42) 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(copy.copy(x), x) 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_inst_setstate(self): 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C: 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, foo): 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = foo 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __setstate__(self, state): 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = state["foo"] 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __cmp__(self, other): 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return cmp(self.foo, other.foo) 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C(42) 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(copy.copy(x), x) 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_inst_getstate_setstate(self): 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C: 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, foo): 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = foo 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getstate__(self): 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.foo 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __setstate__(self, state): 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = state 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __cmp__(self, other): 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return cmp(self.foo, other.foo) 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C(42) 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(copy.copy(x), x) 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # The deepcopy() method 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_basic(self): 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = 42 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y, x) 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_memo(self): 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Tests of reflexive objects are under type-specific sections below. 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # This tests only repetitions of objects. 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = [] 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = [x, x] 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y, x) 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is not x) 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y[0] is not x[0]) 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y[0] is y[1]) 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_issubclass(self): 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # XXX Note: there's no way to test the TypeError coming out of 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # issubclass() -- this can only happen when an extension 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # module defines a "type" that doesn't formally inherit from 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # type. 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Meta(type): 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C: 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __metaclass__ = Meta 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(copy.deepcopy(C), C) 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_deepcopy(self): 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, foo): 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = foo 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __deepcopy__(self, memo=None): 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return C(self.foo) 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C(42) 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y.__class__, x.__class__) 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y.foo, x.foo) 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_registry(self): 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __new__(cls, foo): 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj = object.__new__(cls) 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj.foo = foo 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return obj 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def pickle_C(obj): 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (C, (obj.foo,)) 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C(42) 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, copy.deepcopy, x) 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm copy_reg.pickle(C, pickle_C, C) 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_reduce_ex(self): 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __reduce_ex__(self, proto): 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return "" 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __reduce__(self): 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise test_support.TestFailed, "shouldn't call this" 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C() 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is x) 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_reduce(self): 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __reduce__(self): 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return "" 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C() 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is x) 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_cant(self): 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getattribute__(self, name): 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if name.startswith("__reduce"): 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise AttributeError, name 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return object.__getattribute__(self, name) 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C() 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(copy.Error, copy.deepcopy, x) 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Type-specific _deepcopy_xxx() methods 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_atomic(self): 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Classic: 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class NewStyle(object): 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def f(): 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tests = [None, 42, 2L**100, 3.14, True, False, 1j, 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "hello", u"hello\u1234", f.func_code, 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm NewStyle, xrange(10), Classic, max] 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for x in tests: 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(copy.deepcopy(x) is x, repr(x)) 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_list(self): 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = [[1, 2], 3] 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y, x) 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x is not y) 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x[0] is not y[0]) 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_reflexive_list(self): 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = [] 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x.append(x) 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(RuntimeError, cmp, y, x) 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is not x) 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y[0] is y) 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(y), 1) 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_tuple(self): 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = ([1, 2], 3) 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y, x) 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x is not y) 2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x[0] is not y[0]) 2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_reflexive_tuple(self): 2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = ([],) 2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x[0].append(x) 2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(RuntimeError, cmp, y, x) 2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is not x) 2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y[0] is not x[0]) 2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y[0][0] is y) 2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_dict(self): 2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = {"foo": [1, 2], "bar": 3} 2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y, x) 3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x is not y) 3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x["foo"] is not y["foo"]) 3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_reflexive_dict(self): 3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = {} 3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x['foo'] = x 3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(RuntimeError, cmp, y, x) 3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is not x) 3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y['foo'] is y) 3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(y), 1) 3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_keepalive(self): 3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm memo = {} 3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = 42 3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x, memo) 3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(memo[id(x)] is x) 3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_inst_vanilla(self): 3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C: 3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, foo): 3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = foo 3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __cmp__(self, other): 3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return cmp(self.foo, other.foo) 3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C([42]) 3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y, x) 3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y.foo is not x.foo) 3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_inst_deepcopy(self): 3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C: 3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, foo): 3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = foo 3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __deepcopy__(self, memo): 3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return C(copy.deepcopy(self.foo, memo)) 3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __cmp__(self, other): 3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return cmp(self.foo, other.foo) 3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C([42]) 3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y, x) 3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is not x) 3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y.foo is not x.foo) 3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_inst_getinitargs(self): 3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C: 3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, foo): 3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = foo 3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getinitargs__(self): 3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (self.foo,) 3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __cmp__(self, other): 3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return cmp(self.foo, other.foo) 3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C([42]) 3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y, x) 3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is not x) 3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y.foo is not x.foo) 3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_inst_getstate(self): 3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C: 3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, foo): 3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = foo 3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getstate__(self): 3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return {"foo": self.foo} 3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __cmp__(self, other): 3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return cmp(self.foo, other.foo) 3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C([42]) 3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y, x) 3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is not x) 3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y.foo is not x.foo) 3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_inst_setstate(self): 3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C: 3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, foo): 3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = foo 3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __setstate__(self, state): 3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = state["foo"] 3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __cmp__(self, other): 3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return cmp(self.foo, other.foo) 3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C([42]) 3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y, x) 3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is not x) 3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y.foo is not x.foo) 3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_inst_getstate_setstate(self): 3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C: 3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, foo): 3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = foo 3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getstate__(self): 3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.foo 3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __setstate__(self, state): 3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.foo = state 3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __cmp__(self, other): 3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return cmp(self.foo, other.foo) 3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C([42]) 3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y, x) 3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is not x) 3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y.foo is not x.foo) 4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_reflexive_inst(self): 4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C: 4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C() 4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x.foo = x 4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is not x) 4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y.foo is y) 4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # _reconstruct() 4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_reconstruct_string(self): 4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __reduce__(self): 4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return "" 4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C() 4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.copy(x) 4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is x) 4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is x) 4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_reconstruct_nostate(self): 4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __reduce__(self): 4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (C, ()) 4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C() 4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x.foo = 42 4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.copy(x) 4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y.__class__ is x.__class__) 4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y.__class__ is x.__class__) 4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_reconstruct_state(self): 4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __reduce__(self): 4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (C, (), self.__dict__) 4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __cmp__(self, other): 4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return cmp(self.__dict__, other.__dict__) 4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __hash__ = None # Silence Py3k warning 4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C() 4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x.foo = [42] 4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.copy(x) 4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y, x) 4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y, x) 4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y.foo is not x.foo) 4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_reconstruct_state_setstate(self): 4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __reduce__(self): 4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (C, (), self.__dict__) 4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __setstate__(self, state): 4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.__dict__.update(state) 4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __cmp__(self, other): 4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return cmp(self.__dict__, other.__dict__) 4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __hash__ = None # Silence Py3k warning 4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C() 4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x.foo = [42] 4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.copy(x) 4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y, x) 4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(y, x) 4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y.foo is not x.foo) 4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_reconstruct_reflexive(self): 4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C() 4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x.foo = x 4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is not x) 4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y.foo is y) 4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Additions for Python 2.3 and pickle protocol 2 4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_reduce_4tuple(self): 4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(list): 4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __reduce__(self): 4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (C, (), self.__dict__, iter(self)) 4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __cmp__(self, other): 4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (cmp(list(self), list(other)) or 4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cmp(self.__dict__, other.__dict__)) 4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __hash__ = None # Silence Py3k warning 4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C([[1, 2], 3]) 4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.copy(x) 4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(x, y) 4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x is not y) 4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x[0] is y[0]) 4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(x, y) 4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x is not y) 4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x[0] is not y[0]) 4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_reduce_5tuple(self): 4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(dict): 4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __reduce__(self): 4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (C, (), self.__dict__, None, self.iteritems()) 4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __cmp__(self, other): 4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (cmp(dict(self), list(dict)) or 5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cmp(self.__dict__, other.__dict__)) 5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __hash__ = None # Silence Py3k warning 5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C([("foo", [1, 2]), ("bar", 3)]) 5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.copy(x) 5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(x, y) 5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x is not y) 5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x["foo"] is y["foo"]) 5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(x, y) 5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x is not y) 5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x["foo"] is not y["foo"]) 5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_slots(self): 5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __slots__ = ["foo"] 5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C() 5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x.foo = [42] 5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.copy(x) 5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x.foo is y.foo) 5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_slots(self): 5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __slots__ = ["foo"] 5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C() 5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x.foo = [42] 5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(x.foo, y.foo) 5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x.foo is not y.foo) 5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_dict_subclass(self): 5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(dict): 5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, d=None): 5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not d: 5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._keys = list(d.keys()) 5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dict.__init__(self, d) 5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __setitem__(self, key, item): 5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dict.__setitem__(self, key, item) 5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if key not in self._keys: 5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._keys.append(key) 5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C(d={'foo':0}) 5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(x, y) 5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(x._keys, y._keys) 5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x is not y) 5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x['bar'] = 1 5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotEqual(x, y) 5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotEqual(x._keys, y._keys) 5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_list_subclass(self): 5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(list): 5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C([[1, 2], 3]) 5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x.foo = [4, 5] 5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.copy(x) 5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(x), list(y)) 5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(x.foo, y.foo) 5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x[0] is y[0]) 5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x.foo is y.foo) 5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_list_subclass(self): 5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(list): 5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C([[1, 2], 3]) 5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x.foo = [4, 5] 5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(x), list(y)) 5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(x.foo, y.foo) 5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x[0] is not y[0]) 5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x.foo is not y.foo) 5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_tuple_subclass(self): 5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(tuple): 5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C([1, 2, 3]) 5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(tuple(x), (1, 2, 3)) 5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.copy(x) 5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(tuple(y), (1, 2, 3)) 5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_tuple_subclass(self): 5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(tuple): 5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = C([[1, 2], 3]) 5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(tuple(x), ([1, 2], 3)) 5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = copy.deepcopy(x) 5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(tuple(y), ([1, 2], 3)) 5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x is not y) 5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x[0] is not y[0]) 5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_getstate_exc(self): 5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class EvilState(object): 5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getstate__(self): 5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise ValueError, "ain't got no stickin' state" 5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, copy.copy, EvilState()) 5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_function(self): 5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(copy.copy(global_foo), global_foo) 5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def foo(x, y): return x+y 5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(copy.copy(foo), foo) 5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bar = lambda: None 6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(copy.copy(bar), bar) 6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_function(self): 6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(copy.deepcopy(global_foo), global_foo) 6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def foo(x, y): return x+y 6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(copy.deepcopy(foo), foo) 6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bar = lambda: None 6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(copy.deepcopy(bar), bar) 6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _check_weakref(self, _copy): 6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj = C() 6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = weakref.ref(obj) 6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = _copy(x) 6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is x) 6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del obj 6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = _copy(x) 6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is x) 6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_weakref(self): 6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._check_weakref(copy.copy) 6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_weakref(self): 6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._check_weakref(copy.deepcopy) 6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _check_copy_weakdict(self, _dicttype): 6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm a, b, c, d = [C() for i in xrange(4)] 6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm u = _dicttype() 6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm u[a] = b 6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm u[c] = d 6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = copy.copy(u) 6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(v is u) 6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(v, u) 6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(v[a], b) 6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(v[c], d) 6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(v), 2) 6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del c, d 6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(v), 1) 6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x, y = C(), C() 6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # The underlying containers are decoupled 6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v[x] = y 6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn(x, u) 6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_weakkeydict(self): 6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._check_copy_weakdict(weakref.WeakKeyDictionary) 6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_weakvaluedict(self): 6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._check_copy_weakdict(weakref.WeakValueDictionary) 6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_weakkeydict(self): 6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, i): 6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.i = i 6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm a, b, c, d = [C(i) for i in xrange(4)] 6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm u = weakref.WeakKeyDictionary() 6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm u[a] = b 6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm u[c] = d 6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Keys aren't copied, values are 6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = copy.deepcopy(u) 6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotEqual(v, u) 6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(v), 2) 6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(v[a] is b) 6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(v[c] is d) 6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(v[a].i, b.i) 6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(v[c].i, d.i) 6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del c 6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(v), 1) 6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_weakvaluedict(self): 6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, i): 6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.i = i 6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm a, b, c, d = [C(i) for i in xrange(4)] 6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm u = weakref.WeakValueDictionary() 6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm u[a] = b 6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm u[c] = d 6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Keys are copied, values aren't 6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = copy.deepcopy(u) 6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotEqual(v, u) 6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(v), 2) 6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (x, y), (z, t) = sorted(v.items(), key=lambda pair: pair[0].i) 6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(x is a) 6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(x.i, a.i) 6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(y is b) 6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(z is c) 6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(z.i, c.i) 6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(t is d) 6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del x, y, z, t 6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del d 6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(v), 1) 6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_deepcopy_bound_method(self): 6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Foo(object): 6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def m(self): 6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f = Foo() 6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f.b = f.m 7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm g = copy.deepcopy(f) 7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(g.m, g.b) 7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(g.b.im_self is g) 7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm g.b() 7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef global_foo(x, y): return x+y 7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_main(): 7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test_support.run_unittest(TestCopy) 7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == "__main__": 7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test_main() 713