diff options
Diffstat (limited to 'Lib/weakref.py')
-rw-r--r-- | Lib/weakref.py | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/Lib/weakref.py b/Lib/weakref.py index a9c05d8..b2546f7 100644 --- a/Lib/weakref.py +++ b/Lib/weakref.py @@ -9,7 +9,7 @@ http://python.sourceforge.net/peps/pep-0205.html # they are called this instead of "ref" to avoid name collisions with # the module-global ref() function imported from _weakref. -import UserDict +import collections from _weakref import ( getweakrefcount, @@ -30,7 +30,7 @@ __all__ = ["ref", "proxy", "getweakrefcount", "getweakrefs", "WeakSet"] -class WeakValueDictionary(UserDict.UserDict): +class WeakValueDictionary(collections.MutableMapping): """Mapping class that references values weakly. Entries in the dictionary will be discarded when no strong @@ -48,7 +48,8 @@ class WeakValueDictionary(UserDict.UserDict): if self is not None: del self.data[wr.key] self._remove = remove - UserDict.UserDict.__init__(self, *args, **kw) + self.data = d = {} + d.update(*args, **kw) def __getitem__(self, key): o = self.data[key]() @@ -57,6 +58,12 @@ class WeakValueDictionary(UserDict.UserDict): else: return o + def __delitem__(self, key): + del self.data[key] + + def __len__(self): + return sum(wr() is not None for wr in self.data.values()) + def __contains__(self, key): try: o = self.data[key]() @@ -187,6 +194,7 @@ class WeakValueDictionary(UserDict.UserDict): L.append(o) return L +collections.MutableMapping.register(WeakValueDictionary) class KeyedRef(ref): """Specialized reference that includes a key corresponding to the value. @@ -209,7 +217,7 @@ class KeyedRef(ref): super().__init__(ob, callback) -class WeakKeyDictionary(UserDict.UserDict): +class WeakKeyDictionary(collections.MutableMapping): """ Mapping class that references keys weakly. Entries in the dictionary will be discarded when there is no @@ -235,6 +243,9 @@ class WeakKeyDictionary(UserDict.UserDict): def __getitem__(self, key): return self.data[ref(key)] + def __len__(self): + return len(self.data) + def __repr__(self): return "<WeakKeyDictionary at %s>" % id(self) @@ -339,3 +350,5 @@ class WeakKeyDictionary(UserDict.UserDict): d[ref(key, self._remove)] = value if len(kwargs): self.update(kwargs) + +collections.MutableMapping.register(WeakKeyDictionary) |