1 """Weak reference support for Python.
3 This module is an implementation of PEP 205:
5 http://python.sourceforge.net/peps/pep-0205.html
14 from _weakref
import \
23 from exceptions
import ReferenceError
26 ProxyTypes = (ProxyType, CallableProxyType)
28 __all__ = [
"ref",
"proxy",
"getweakrefcount",
"getweakrefs",
29 "WeakKeyDictionary",
"ReferenceType",
"ProxyType",
30 "CallableProxyType",
"ProxyTypes",
"WeakValueDictionary"]
34 """Mapping class that references values weakly.
36 Entries in the dictionary will be discarded when no strong
37 reference to the value exists anymore
53 return "<WeakValueDictionary at %s>" % id(self)
60 for key, wr
in self.data.items():
66 def get(self, key, default=None):
81 for key, wr
in self.data.items():
91 return self.data.iterkeys()
99 key, wr = self.data.popitem()
115 for key, o
in dict.items():
120 for wr
in self.data.values():
126 def __makeremove(self, key):
127 def remove(o, selfref=ref(self), key=key):
135 """ Mapping class that references keys weakly.
137 Entries in the dictionary will be discarded when there is no
138 longer a strong reference to the key. This can be used to
139 associate additional data with an object owned by other parts of
140 an application without adding attributes to those objects. This
141 can be especially useful with objects that override attribute
147 if dict
is not None: self.
update(dict)
148 def remove(k, selfref=ref(self)):
155 for ref
in self.data.iterkeys():
165 return "<WeakKeyDictionary at %s>" % id(self)
172 for key, value
in self.data.items():
178 def get(self, key, default=None):
179 return self.data.get(
ref(key),default)
186 return self.data.has_key(wr)
190 for key, value
in self.data.items():
204 return self.data.itervalues()
208 for wr
in self.data.keys():
216 key, value = self.data.popitem()
222 return self.data.setdefault(
ref(key, self.
_remove),default)
226 for key, value
in dict.items():
237 self.
_next = weakdict.data.iterkeys().next
249 self.
_next = weakdict.data.iteritems().next
253 wr, value = self.
_next()
261 self.
_next = weakdict.data.itervalues().next
273 self.
_next = weakdict.data.iteritems().next
277 key, wr = self.
_next()
279 if value
is not None: