return "<WeakValueDictionary at %s>" % id(self)
def __setitem__(self, key, value):
- def remove(o, data=self.data, key=key):
- del data[key]
- self.data[key] = ref(value, remove)
+ self.data[key] = ref(value, self.__makeremove(key))
def copy(self):
new = WeakValueDictionary()
try:
wr = self.data[key]
except KeyError:
- def remove(o, data=self.data, key=key):
- del data[key]
- self.data[key] = ref(default, remove)
+ self.data[key] = ref(default, self.__makeremove(key))
return default
else:
return wr()
def update(self, dict):
d = self.data
for key, o in dict.items():
- def remove(o, data=d, key=key):
- del data[key]
- d[key] = ref(o, remove)
+ d[key] = ref(o, self.__makeremove(key))
def values(self):
L = []
L.append(o)
return L
+ def __makeremove(self, key):
+ def remove(o, selfref=ref(self), key=key):
+ self = selfref()
+ if self is not None:
+ del self.data[key]
+ return remove
+
class WeakKeyDictionary(UserDict.UserDict):
""" Mapping class that references keys weakly.
def __init__(self, dict=None):
self.data = {}
if dict is not None: self.update(dict)
- def remove(k, data=self.data):
- del data[k]
+ def remove(k, selfref=ref(self)):
+ self = selfref()
+ if self is not None:
+ del self.data[k]
self._remove = remove
def __delitem__(self, key):