]> granicus.if.org Git - python/commitdiff
Decouple weakref containers from UserDict
authorRaymond Hettinger <python@rcn.com>
Tue, 5 Feb 2008 01:15:57 +0000 (01:15 +0000)
committerRaymond Hettinger <python@rcn.com>
Tue, 5 Feb 2008 01:15:57 +0000 (01:15 +0000)
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

index a9c05d82d9422580b05638a2099170bc1f418d3d..b2546f72234dbe81198649a0d71ad8a174d64f8d 100644 (file)
@@ -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)