summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/weakref.py21
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)