weakref.py revision b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1
141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake"""Weak reference support for Python.
241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred DrakeThis module is an implementation of PEP 205:
441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drakehttp://python.sourceforge.net/peps/pep-0205.html
641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake"""
741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
8bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake# Naming convention: Variables named "wr" are weak reference objects;
9bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake# they are called this instead of "ref" to avoid name collisions with
10bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake# the module-global ref() function imported from _weakref.
11bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake
1241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drakeimport UserDict
1341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
1441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drakefrom _weakref import \
1541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake     getweakrefcount, \
1641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake     getweakrefs, \
1741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake     ref, \
1841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake     proxy, \
1941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake     ReferenceError, \
2041deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake     CallableProxyType, \
2141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake     ProxyType, \
2241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake     ReferenceType
2341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
2441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred DrakeProxyTypes = (ProxyType, CallableProxyType)
2541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
269a9d219f07656a9f1eb6f8beb2a9e2ee462b77f8Fred Drake__all__ = ["ref", "proxy", "getweakrefcount", "getweakrefs",
2740fc16059f04ee8fda0b5956cc4883eb21ca8f8cSkip Montanaro           "WeakKeyDictionary", "ReferenceType", "ProxyType",
2840fc16059f04ee8fda0b5956cc4883eb21ca8f8cSkip Montanaro           "CallableProxyType", "ProxyTypes", "WeakValueDictionary"]
2941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
30bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake
315e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwisclass WeakValueDictionary(UserDict.UserDict):
32bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    """Mapping class that references values weakly.
3341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
34bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    Entries in the dictionary will be discarded when no strong
35bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    reference to the value exists anymore
36bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    """
3741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    # We inherit the constructor without worrying about the input
3841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    # dictionary; since it uses our .update() method, we get the right
399d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake    # checks (if the other dictionary is a WeakValueDictionary,
409d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake    # objects are unwrapped on the way out, and we always wrap on the
419d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake    # way in).
4241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
4341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def __getitem__(self, key):
444fd06e0170aa75e4873b73f733bfd3f3de19d967Fred Drake        o = self.data[key]()
4541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        if o is None:
4641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            raise KeyError, key
4741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        else:
4841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            return o
4941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
5041deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def __repr__(self):
519d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake        return "<WeakValueDictionary at %s>" % id(self)
5241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
5341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def __setitem__(self, key, value):
5441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        def remove(o, data=self.data, key=key):
5541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            del data[key]
5641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        self.data[key] = ref(value, remove)
5741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
5841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def copy(self):
599d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake        new = WeakValueDictionary()
60bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake        for key, wr in self.data.items():
61bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
6241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            if o is not None:
6341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                new[key] = o
649d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake        return new
6541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
661d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake    def get(self, key, default=None):
6741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        try:
68bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            wr = self.data[key]
6941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        except KeyError:
7041deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            return default
7141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        else:
72bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
7341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            if o is None:
7441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                # This should only happen
7541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                return default
7641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            else:
7741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                return o
7841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
7941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def items(self):
80312a5dc539b583abcbbf006942a4ceead9b9172bFred Drake        L = []
81bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake        for key, wr in self.data.items():
82bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
8341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            if o is not None:
84312a5dc539b583abcbbf006942a4ceead9b9172bFred Drake                L.append((key, o))
8541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        return L
8641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
87101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def iteritems(self):
88101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        return WeakValuedItemIterator(self)
89101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
90101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def iterkeys(self):
91101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        return self.data.iterkeys()
92101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    __iter__ = iterkeys
93101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
94101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def itervalues(self):
95101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        return WeakValuedValueIterator(self)
96101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
9741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def popitem(self):
9841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        while 1:
99bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            key, wr = self.data.popitem()
100bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
10141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            if o is not None:
10241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                return key, o
10341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
10441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def setdefault(self, key, default):
10541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        try:
106bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            wr = self.data[key]
10741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        except KeyError:
10841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            def remove(o, data=self.data, key=key):
10941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                del data[key]
110bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            self.data[key] = ref(default, remove)
11141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            return default
11241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        else:
113bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            return wr()
11441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
11541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def update(self, dict):
11641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        d = self.data
11741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        for key, o in dict.items():
11841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            def remove(o, data=d, key=key):
11941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                del data[key]
120bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            d[key] = ref(o, remove)
12141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
12241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def values(self):
12341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        L = []
124bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake        for wr in self.data.values():
125bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
12641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            if o is not None:
12741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                L.append(o)
12841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        return L
12941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
13041deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
1315e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwisclass WeakKeyDictionary(UserDict.UserDict):
132bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    """ Mapping class that references keys weakly.
133bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake
134bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    Entries in the dictionary will be discarded when there is no
135bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    longer a strong reference to the key. This can be used to
136bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    associate additional data with an object owned by other parts of
137bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    an application without adding attributes to those objects. This
138bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    can be especially useful with objects that override attribute
139bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    accesses.
140bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    """
1415e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
1425e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def __init__(self, dict=None):
1435e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        self.data = {}
1445e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        if dict is not None: self.update(dict)
1455e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        def remove(k, data=self.data):
1465e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            del data[k]
1475e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        self._remove = remove
1485e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
149b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake    def __delitem__(self, key):
150b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake        for ref in self.data.iterkeys():
151b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake            o = ref()
152b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake            if o == key:
153b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake                del self.data[ref]
154b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake                return
155b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake
1565e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def __getitem__(self, key):
1575e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        return self.data[ref(key)]
1585e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
1595e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def __repr__(self):
1605e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        return "<WeakKeyDictionary at %s>" % id(self)
1615e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
1625e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def __setitem__(self, key, value):
1635e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        self.data[ref(key, self._remove)] = value
1645e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
1655e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def copy(self):
1665e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        new = WeakKeyDictionary()
1675e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        for key, value in self.data.items():
1685e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            o = key()
1695e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            if o is not None:
1705e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis                new[o] = value
1719d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake        return new
1725e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
1731d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake    def get(self, key, default=None):
1745e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        return self.data.get(ref(key),default)
1755e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
1761d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake    def has_key(self, key):
1771d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake        return self.data.has_key(ref(key))
1781d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake
1795e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def items(self):
1805e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        L = []
1815e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        for key, value in self.data.items():
1825e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            o = key()
1835e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            if o is not None:
1845e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis                L.append((o, value))
1855e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        return L
1865e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
187101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def iteritems(self):
188101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        return WeakKeyedItemIterator(self)
189101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
190101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def iterkeys(self):
191101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        return WeakKeyedKeyIterator(self)
192101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    __iter__ = iterkeys
193101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
194101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def itervalues(self):
195101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        return self.data.itervalues()
196101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
1971d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake    def keys(self):
1981d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake        L = []
199bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake        for wr in self.data.keys():
200bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
2011d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake            if o is not None:
2021d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake                L.append(o)
2031d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake        return L
2041d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake
2055e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def popitem(self):
2065e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        while 1:
2075e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            key, value = self.data.popitem()
2085e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            o = key()
2095e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            if o is not None:
2105e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis                return o, value
2115e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
2125e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def setdefault(self, key, default):
2135e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        return self.data.setdefault(ref(key, self._remove),default)
2145e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
2155e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def update(self, dict):
2165e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        d = self.data
2175e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        for key, value in dict.items():
218bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            d[ref(key, self._remove)] = value
219bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake
2205e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
221101209d44ce063cd04fd6793d94991f8e6688428Fred Drakeclass BaseIter:
222101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def __iter__(self):
223101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        return self
224101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
225101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
226101209d44ce063cd04fd6793d94991f8e6688428Fred Drakeclass WeakKeyedKeyIterator(BaseIter):
227101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def __init__(self, weakdict):
228101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        self._next = weakdict.data.iterkeys().next
229101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
230101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def next(self):
231101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        while 1:
232101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            wr = self._next()
233101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            obj = wr()
234101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            if obj is not None:
235101209d44ce063cd04fd6793d94991f8e6688428Fred Drake                return obj
236101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
237101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
238101209d44ce063cd04fd6793d94991f8e6688428Fred Drakeclass WeakKeyedItemIterator(BaseIter):
239101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def __init__(self, weakdict):
240101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        self._next = weakdict.data.iteritems().next
241101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
242101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def next(self):
243101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        while 1:
244101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            wr, value = self._next()
245101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            key = wr()
246101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            if key is not None:
247101209d44ce063cd04fd6793d94991f8e6688428Fred Drake                return key, value
248101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
249101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
250101209d44ce063cd04fd6793d94991f8e6688428Fred Drakeclass WeakValuedValueIterator(BaseIter):
251101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def __init__(self, weakdict):
252101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        self._next = weakdict.data.itervalues().next
253101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
254101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def next(self):
255101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        while 1:
256101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            wr = self._next()
257101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            obj = wr()
258101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            if obj is not None:
259101209d44ce063cd04fd6793d94991f8e6688428Fred Drake                return obj
260101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
261101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
262101209d44ce063cd04fd6793d94991f8e6688428Fred Drakeclass WeakValuedItemIterator(BaseIter):
263101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def __init__(self, weakdict):
264101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        self._next = weakdict.data.iteritems().next
265101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
266101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def next(self):
267101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        while 1:
268101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            key, wr = self._next()
269101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            value = wr()
270101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            if value is not None:
271101209d44ce063cd04fd6793d94991f8e6688428Fred Drake                return key, value
272101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
273101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
27441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake# no longer needed
27541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drakedel UserDict
276