weakref.py revision 3bae7ddf8e63889b185235f85a6695bc05d59059
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 CallableProxyType, \ 2041deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake ProxyType, \ 2141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake ReferenceType 2241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake 23e029242d5cfb8a3879bdc7324db4449e6a8451cfFred Drakefrom exceptions import ReferenceError 24e029242d5cfb8a3879bdc7324db4449e6a8451cfFred Drake 25e029242d5cfb8a3879bdc7324db4449e6a8451cfFred Drake 2641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred DrakeProxyTypes = (ProxyType, CallableProxyType) 2741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake 289a9d219f07656a9f1eb6f8beb2a9e2ee462b77f8Fred Drake__all__ = ["ref", "proxy", "getweakrefcount", "getweakrefs", 2940fc16059f04ee8fda0b5956cc4883eb21ca8f8cSkip Montanaro "WeakKeyDictionary", "ReferenceType", "ProxyType", 3040fc16059f04ee8fda0b5956cc4883eb21ca8f8cSkip Montanaro "CallableProxyType", "ProxyTypes", "WeakValueDictionary"] 3141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake 32bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake 335e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwisclass WeakValueDictionary(UserDict.UserDict): 34bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake """Mapping class that references values weakly. 3541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake 36bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake Entries in the dictionary will be discarded when no strong 37bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake reference to the value exists anymore 38bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake """ 3941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake # We inherit the constructor without worrying about the input 4041deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake # dictionary; since it uses our .update() method, we get the right 419d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake # checks (if the other dictionary is a WeakValueDictionary, 429d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake # objects are unwrapped on the way out, and we always wrap on the 439d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake # way in). 4441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake 4541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake def __getitem__(self, key): 464fd06e0170aa75e4873b73f733bfd3f3de19d967Fred Drake o = self.data[key]() 4741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake if o is None: 4841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake raise KeyError, key 4941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake else: 5041deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake return o 5141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake 5241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake def __repr__(self): 539d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake return "<WeakValueDictionary at %s>" % id(self) 5441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake 5541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake def __setitem__(self, key, value): 56746fe0fae5442403c64be34b87609601166e97c8Fred Drake self.data[key] = ref(value, self.__makeremove(key)) 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: 108746fe0fae5442403c64be34b87609601166e97c8Fred Drake self.data[key] = ref(default, self.__makeremove(key)) 10941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake return default 11041deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake else: 111bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake return wr() 11241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake 11341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake def update(self, dict): 11441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake d = self.data 11541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake for key, o in dict.items(): 116746fe0fae5442403c64be34b87609601166e97c8Fred Drake d[key] = ref(o, self.__makeremove(key)) 11741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake 11841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake def values(self): 11941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake L = [] 120bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake for wr in self.data.values(): 121bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake o = wr() 12241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake if o is not None: 12341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake L.append(o) 12441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake return L 12541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake 126746fe0fae5442403c64be34b87609601166e97c8Fred Drake def __makeremove(self, key): 127746fe0fae5442403c64be34b87609601166e97c8Fred Drake def remove(o, selfref=ref(self), key=key): 128746fe0fae5442403c64be34b87609601166e97c8Fred Drake self = selfref() 129746fe0fae5442403c64be34b87609601166e97c8Fred Drake if self is not None: 130746fe0fae5442403c64be34b87609601166e97c8Fred Drake del self.data[key] 131746fe0fae5442403c64be34b87609601166e97c8Fred Drake return remove 132746fe0fae5442403c64be34b87609601166e97c8Fred Drake 13341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake 1345e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwisclass WeakKeyDictionary(UserDict.UserDict): 135bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake """ Mapping class that references keys weakly. 136bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake 137bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake Entries in the dictionary will be discarded when there is no 138bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake longer a strong reference to the key. This can be used to 139bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake associate additional data with an object owned by other parts of 140bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake an application without adding attributes to those objects. This 141bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake can be especially useful with objects that override attribute 142bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake accesses. 143bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake """ 1445e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis 1455e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis def __init__(self, dict=None): 1465e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis self.data = {} 1475e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis if dict is not None: self.update(dict) 148746fe0fae5442403c64be34b87609601166e97c8Fred Drake def remove(k, selfref=ref(self)): 149746fe0fae5442403c64be34b87609601166e97c8Fred Drake self = selfref() 150746fe0fae5442403c64be34b87609601166e97c8Fred Drake if self is not None: 151746fe0fae5442403c64be34b87609601166e97c8Fred Drake del self.data[k] 1525e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis self._remove = remove 1535e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis 154b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake def __delitem__(self, key): 155b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake for ref in self.data.iterkeys(): 156b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake o = ref() 157b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake if o == key: 158b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake del self.data[ref] 159b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake return 160b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake 1615e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis def __getitem__(self, key): 1625e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis return self.data[ref(key)] 1635e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis 1645e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis def __repr__(self): 1655e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis return "<WeakKeyDictionary at %s>" % id(self) 1665e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis 1675e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis def __setitem__(self, key, value): 1685e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis self.data[ref(key, self._remove)] = value 1695e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis 1705e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis def copy(self): 1715e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis new = WeakKeyDictionary() 1725e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis for key, value in self.data.items(): 1735e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis o = key() 1745e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis if o is not None: 1755e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis new[o] = value 1769d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake return new 1775e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis 1781d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake def get(self, key, default=None): 1795e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis return self.data.get(ref(key),default) 1805e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis 1811d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake def has_key(self, key): 1823bae7ddf8e63889b185235f85a6695bc05d59059Fred Drake try: 1833bae7ddf8e63889b185235f85a6695bc05d59059Fred Drake wr = ref(key) 1843bae7ddf8e63889b185235f85a6695bc05d59059Fred Drake except TypeError: 1853bae7ddf8e63889b185235f85a6695bc05d59059Fred Drake return 0 1863bae7ddf8e63889b185235f85a6695bc05d59059Fred Drake return self.data.has_key(wr) 1871d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake 1885e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis def items(self): 1895e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis L = [] 1905e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis for key, value in self.data.items(): 1915e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis o = key() 1925e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis if o is not None: 1935e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis L.append((o, value)) 1945e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis return L 1955e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis 196101209d44ce063cd04fd6793d94991f8e6688428Fred Drake def iteritems(self): 197101209d44ce063cd04fd6793d94991f8e6688428Fred Drake return WeakKeyedItemIterator(self) 198101209d44ce063cd04fd6793d94991f8e6688428Fred Drake 199101209d44ce063cd04fd6793d94991f8e6688428Fred Drake def iterkeys(self): 200101209d44ce063cd04fd6793d94991f8e6688428Fred Drake return WeakKeyedKeyIterator(self) 201101209d44ce063cd04fd6793d94991f8e6688428Fred Drake __iter__ = iterkeys 202101209d44ce063cd04fd6793d94991f8e6688428Fred Drake 203101209d44ce063cd04fd6793d94991f8e6688428Fred Drake def itervalues(self): 204101209d44ce063cd04fd6793d94991f8e6688428Fred Drake return self.data.itervalues() 205101209d44ce063cd04fd6793d94991f8e6688428Fred Drake 2061d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake def keys(self): 2071d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake L = [] 208bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake for wr in self.data.keys(): 209bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake o = wr() 2101d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake if o is not None: 2111d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake L.append(o) 2121d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake return L 2131d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake 2145e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis def popitem(self): 2155e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis while 1: 2165e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis key, value = self.data.popitem() 2175e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis o = key() 2185e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis if o is not None: 2195e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis return o, value 2205e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis 2215e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis def setdefault(self, key, default): 2225e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis return self.data.setdefault(ref(key, self._remove),default) 2235e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis 2245e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis def update(self, dict): 2255e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis d = self.data 2265e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis for key, value in dict.items(): 227bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake d[ref(key, self._remove)] = value 228bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake 2295e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis 230101209d44ce063cd04fd6793d94991f8e6688428Fred Drakeclass BaseIter: 231101209d44ce063cd04fd6793d94991f8e6688428Fred Drake def __iter__(self): 232101209d44ce063cd04fd6793d94991f8e6688428Fred Drake return self 233101209d44ce063cd04fd6793d94991f8e6688428Fred Drake 234101209d44ce063cd04fd6793d94991f8e6688428Fred Drake 235101209d44ce063cd04fd6793d94991f8e6688428Fred Drakeclass WeakKeyedKeyIterator(BaseIter): 236101209d44ce063cd04fd6793d94991f8e6688428Fred Drake def __init__(self, weakdict): 237101209d44ce063cd04fd6793d94991f8e6688428Fred Drake self._next = weakdict.data.iterkeys().next 238101209d44ce063cd04fd6793d94991f8e6688428Fred Drake 239101209d44ce063cd04fd6793d94991f8e6688428Fred Drake def next(self): 240101209d44ce063cd04fd6793d94991f8e6688428Fred Drake while 1: 241101209d44ce063cd04fd6793d94991f8e6688428Fred Drake wr = self._next() 242101209d44ce063cd04fd6793d94991f8e6688428Fred Drake obj = wr() 243101209d44ce063cd04fd6793d94991f8e6688428Fred Drake if obj is not None: 244101209d44ce063cd04fd6793d94991f8e6688428Fred Drake return obj 245101209d44ce063cd04fd6793d94991f8e6688428Fred Drake 246101209d44ce063cd04fd6793d94991f8e6688428Fred Drake 247101209d44ce063cd04fd6793d94991f8e6688428Fred Drakeclass WeakKeyedItemIterator(BaseIter): 248101209d44ce063cd04fd6793d94991f8e6688428Fred Drake def __init__(self, weakdict): 249101209d44ce063cd04fd6793d94991f8e6688428Fred Drake self._next = weakdict.data.iteritems().next 250101209d44ce063cd04fd6793d94991f8e6688428Fred Drake 251101209d44ce063cd04fd6793d94991f8e6688428Fred Drake def next(self): 252101209d44ce063cd04fd6793d94991f8e6688428Fred Drake while 1: 253101209d44ce063cd04fd6793d94991f8e6688428Fred Drake wr, value = self._next() 254101209d44ce063cd04fd6793d94991f8e6688428Fred Drake key = wr() 255101209d44ce063cd04fd6793d94991f8e6688428Fred Drake if key is not None: 256101209d44ce063cd04fd6793d94991f8e6688428Fred Drake return key, value 257101209d44ce063cd04fd6793d94991f8e6688428Fred Drake 258101209d44ce063cd04fd6793d94991f8e6688428Fred Drake 259101209d44ce063cd04fd6793d94991f8e6688428Fred Drakeclass WeakValuedValueIterator(BaseIter): 260101209d44ce063cd04fd6793d94991f8e6688428Fred Drake def __init__(self, weakdict): 261101209d44ce063cd04fd6793d94991f8e6688428Fred Drake self._next = weakdict.data.itervalues().next 262101209d44ce063cd04fd6793d94991f8e6688428Fred Drake 263101209d44ce063cd04fd6793d94991f8e6688428Fred Drake def next(self): 264101209d44ce063cd04fd6793d94991f8e6688428Fred Drake while 1: 265101209d44ce063cd04fd6793d94991f8e6688428Fred Drake wr = self._next() 266101209d44ce063cd04fd6793d94991f8e6688428Fred Drake obj = wr() 267101209d44ce063cd04fd6793d94991f8e6688428Fred Drake if obj is not None: 268101209d44ce063cd04fd6793d94991f8e6688428Fred Drake return obj 269101209d44ce063cd04fd6793d94991f8e6688428Fred Drake 270101209d44ce063cd04fd6793d94991f8e6688428Fred Drake 271101209d44ce063cd04fd6793d94991f8e6688428Fred Drakeclass WeakValuedItemIterator(BaseIter): 272101209d44ce063cd04fd6793d94991f8e6688428Fred Drake def __init__(self, weakdict): 273101209d44ce063cd04fd6793d94991f8e6688428Fred Drake self._next = weakdict.data.iteritems().next 274101209d44ce063cd04fd6793d94991f8e6688428Fred Drake 275101209d44ce063cd04fd6793d94991f8e6688428Fred Drake def next(self): 276101209d44ce063cd04fd6793d94991f8e6688428Fred Drake while 1: 277101209d44ce063cd04fd6793d94991f8e6688428Fred Drake key, wr = self._next() 278101209d44ce063cd04fd6793d94991f8e6688428Fred Drake value = wr() 279101209d44ce063cd04fd6793d94991f8e6688428Fred Drake if value is not None: 280101209d44ce063cd04fd6793d94991f8e6688428Fred Drake return key, value 281101209d44ce063cd04fd6793d94991f8e6688428Fred Drake 282101209d44ce063cd04fd6793d94991f8e6688428Fred Drake 28341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake# no longer needed 28441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drakedel UserDict 285