test_weakref.py

来自「mallet是自然语言处理、机器学习领域的一个开源项目。」· Python 代码 · 共 574 行 · 第 1/2 页

PY
574
字号
        #        dict, objects = self.make_weak_valued_dict()        for o in objects:            self.assert_(weakref.getweakrefcount(o) == 1,                         "wrong number of weak references to %r!" % o)            self.assert_(o is dict[o.arg],                         "wrong object returned by weak dict!")        items1 = dict.items()        items2 = dict.copy().items()        items1.sort()        items2.sort()        self.assert_(items1 == items2,                     "cloning of weak-valued dictionary did not work!")        del items1, items2        self.assert_(len(dict) == self.COUNT)        del objects[0]        self.assert_(len(dict) == (self.COUNT - 1),                     "deleting object did not cause dictionary update")        del objects, o        self.assert_(len(dict) == 0,                     "deleting the values did not clear the dictionary")        # regression on SF bug #447152:        dict = weakref.WeakValueDictionary()        self.assertRaises(KeyError, dict.__getitem__, 1)        dict[2] = C()        self.assertRaises(KeyError, dict.__getitem__, 2)    def test_weak_keys(self):        #        #  This exercises d.copy(), d.items(), d[] = v, d[], del d[],        #  len(d), d.has_key().        #        dict, objects = self.make_weak_keyed_dict()        for o in objects:            self.assert_(weakref.getweakrefcount(o) == 1,                         "wrong number of weak references to %r!" % o)            self.assert_(o.arg is dict[o],                         "wrong object returned by weak dict!")        items1 = dict.items()        items2 = dict.copy().items()        items1.sort()        items2.sort()        self.assert_(items1 == items2,                     "cloning of weak-keyed dictionary did not work!")        del items1, items2        self.assert_(len(dict) == self.COUNT)        del objects[0]        self.assert_(len(dict) == (self.COUNT - 1),                     "deleting object did not cause dictionary update")        del objects, o        self.assert_(len(dict) == 0,                     "deleting the keys did not clear the dictionary")        o = Object(42)        dict[o] = "What is the meaning of the universe?"        self.assert_(dict.has_key(o))        self.assert_(not dict.has_key(34))    def test_weak_keyed_iters(self):        dict, objects = self.make_weak_keyed_dict()        self.check_iters(dict)    def test_weak_valued_iters(self):        dict, objects = self.make_weak_valued_dict()        self.check_iters(dict)    def check_iters(self, dict):        # item iterator:        items = dict.items()        for item in dict.iteritems():            items.remove(item)        self.assert_(len(items) == 0, "iteritems() did not touch all items")        # key iterator, via __iter__():        keys = dict.keys()        for k in dict:            keys.remove(k)        self.assert_(len(keys) == 0, "__iter__() did not touch all keys")        # key iterator, via iterkeys():        keys = dict.keys()        for k in dict.iterkeys():            keys.remove(k)        self.assert_(len(keys) == 0, "iterkeys() did not touch all keys")        # value iterator:        values = dict.values()        for v in dict.itervalues():            values.remove(v)        self.assert_(len(values) == 0, "itervalues() did not touch all values")    def test_make_weak_keyed_dict_from_dict(self):        o = Object(3)        dict = weakref.WeakKeyDictionary({o:364})        self.assert_(dict[o] == 364)    def test_make_weak_keyed_dict_from_weak_keyed_dict(self):        o = Object(3)        dict = weakref.WeakKeyDictionary({o:364})        dict2 = weakref.WeakKeyDictionary(dict)        self.assert_(dict[o] == 364)    def make_weak_keyed_dict(self):        dict = weakref.WeakKeyDictionary()        objects = map(Object, range(self.COUNT))        for o in objects:            dict[o] = o.arg        return dict, objects    def make_weak_valued_dict(self):        dict = weakref.WeakValueDictionary()        objects = map(Object, range(self.COUNT))        for o in objects:            dict[o.arg] = o        return dict, objects    def check_popitem(self, klass, key1, value1, key2, value2):        weakdict = klass()        weakdict[key1] = value1        weakdict[key2] = value2        self.assert_(len(weakdict) == 2)        k, v = weakdict.popitem()        self.assert_(len(weakdict) == 1)        if k is key1:            self.assert_(v is value1)        else:            self.assert_(v is value2)        k, v = weakdict.popitem()        self.assert_(len(weakdict) == 0)        if k is key1:            self.assert_(v is value1)        else:            self.assert_(v is value2)    def test_weak_valued_dict_popitem(self):        self.check_popitem(weakref.WeakValueDictionary,                           "key1", C(), "key2", C())    def test_weak_keyed_dict_popitem(self):        self.check_popitem(weakref.WeakKeyDictionary,                           C(), "value 1", C(), "value 2")    def check_setdefault(self, klass, key, value1, value2):        self.assert_(value1 is not value2,                     "invalid test"                     " -- value parameters must be distinct objects")        weakdict = klass()        o = weakdict.setdefault(key, value1)        self.assert_(o is value1)        self.assert_(weakdict.has_key(key))        self.assert_(weakdict.get(key) is value1)        self.assert_(weakdict[key] is value1)        o = weakdict.setdefault(key, value2)        self.assert_(o is value1)        self.assert_(weakdict.has_key(key))        self.assert_(weakdict.get(key) is value1)        self.assert_(weakdict[key] is value1)    def test_weak_valued_dict_setdefault(self):        self.check_setdefault(weakref.WeakValueDictionary,                              "key", C(), C())    def test_weak_keyed_dict_setdefault(self):        self.check_setdefault(weakref.WeakKeyDictionary,                              C(), "value 1", "value 2")    def check_update(self, klass, dict):        #        #  This exercises d.update(), len(d), d.keys(), d.has_key(),        #  d.get(), d[].        #        weakdict = klass()        weakdict.update(dict)        self.assert_(len(weakdict) == len(dict))        for k in weakdict.keys():            self.assert_(dict.has_key(k),                         "mysterious new key appeared in weak dict")            v = dict.get(k)            self.assert_(v is weakdict[k])            self.assert_(v is weakdict.get(k))        for k in dict.keys():            self.assert_(weakdict.has_key(k),                         "original key disappeared in weak dict")            v = dict[k]            self.assert_(v is weakdict[k])            self.assert_(v is weakdict.get(k))    def test_weak_valued_dict_update(self):        self.check_update(weakref.WeakValueDictionary,                          {1: C(), 'a': C(), C(): C()})    def test_weak_keyed_dict_update(self):        self.check_update(weakref.WeakKeyDictionary,                          {C(): 1, C(): 2, C(): 3})    def test_weak_keyed_delitem(self):        d = weakref.WeakKeyDictionary()        o1 = Object('1')        o2 = Object('2')        d[o1] = 'something'        d[o2] = 'something'        self.assert_(len(d) == 2)        del d[o1]        self.assert_(len(d) == 1)        self.assert_(d.keys() == [o2])    def test_weak_valued_delitem(self):        d = weakref.WeakValueDictionary()        o1 = Object('1')        o2 = Object('2')        d['something'] = o1        d['something else'] = o2        self.assert_(len(d) == 2)        del d['something']        self.assert_(len(d) == 1)        self.assert_(d.items() == [('something else', o2)])    def test_weak_keyed_bad_delitem(self):        d = weakref.WeakKeyDictionary()        o = Object('1')        # An attempt to delete an object that isn't there should raise        # KeyError.  It didn't before 2.3.        self.assertRaises(KeyError, d.__delitem__, o)        self.assertRaises(KeyError, d.__getitem__, o)        # If a key isn't of a weakly referencable type, __getitem__ and        # __setitem__ raise TypeError.  __delitem__ should too.        self.assertRaises(TypeError, d.__delitem__,  13)        self.assertRaises(TypeError, d.__getitem__,  13)        self.assertRaises(TypeError, d.__setitem__,  13, 13)    def test_weak_keyed_cascading_deletes(self):        # SF bug 742860.  For some reason, before 2.3 __delitem__ iterated        # over the keys via self.data.iterkeys().  If things vanished from        # the dict during this (or got added), that caused a RuntimeError.        d = weakref.WeakKeyDictionary()        mutate = False        class C(object):            def __init__(self, i):                self.value = i            def __hash__(self):                return hash(self.value)            def __eq__(self, other):                if mutate:                    # Side effect that mutates the dict, by removing the                    # last strong reference to a key.                    del objs[-1]                return self.value == other.value        objs = [C(i) for i in range(4)]        for o in objs:            d[o] = o.value        del o   # now the only strong references to keys are in objs        # Find the order in which iterkeys sees the keys.        objs = d.keys()        # Reverse it, so that the iteration implementation of __delitem__        # has to keep looping to find the first object we delete.        objs.reverse()        # Turn on mutation in C.__eq__.  The first time thru the loop,        # under the iterkeys() business the first comparison will delete        # the last item iterkeys() would see, and that causes a        #     RuntimeError: dictionary changed size during iteration        # when the iterkeys() loop goes around to try comparing the next        # key.  After this was fixed, it just deletes the last object *our*        # "for o in obj" loop would have gotten to.        mutate = True        count = 0        for o in objs:            count += 1            del d[o]        self.assertEqual(len(d), 0)        self.assertEqual(count, 2)def test_main():    loader = unittest.TestLoader()    suite = unittest.TestSuite()    suite.addTest(loader.loadTestsFromTestCase(ReferencesTestCase))    suite.addTest(loader.loadTestsFromTestCase(MappingTestCase))    test_support.run_suite(suite)if __name__ == "__main__":    test_main()

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?