From 7ac609559da71b247bf6c2d37e8af9b2eadea2a7 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Tue, 5 Feb 2008 01:15:57 +0000 Subject: Decouple weakref containers from UserDict and teach them to use ABC instead. More work left to do later. Still need to modernize the API of the dictlike objects to more closely match regulars dicts. --- Lib/weakref.py | 21 +++++++++++++++++---- 1 file 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 "" % 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) -- cgit v0.12