From bbe2f60b3c19ecaa02ca07be14474eaacfcb59a0 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Thu, 1 Mar 2012 16:26:35 +0100 Subject: Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying. Moreover, the implementation is now O(1) rather than O(n). Thanks to Yury Selivanov for reporting. --- Lib/weakref.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Lib/weakref.py') diff --git a/Lib/weakref.py b/Lib/weakref.py index 468f8f1029..fcb6b74d1b 100644 --- a/Lib/weakref.py +++ b/Lib/weakref.py @@ -78,7 +78,7 @@ class WeakValueDictionary(collections.MutableMapping): del self.data[key] def __len__(self): - return sum(wr() is not None for wr in self.data.values()) + return len(self.data) - len(self._pending_removals) def __contains__(self, key): try: @@ -290,7 +290,7 @@ class WeakKeyDictionary(collections.MutableMapping): return self.data[ref(key)] def __len__(self): - return len(self.data) + return len(self.data) - len(self._pending_removals) def __repr__(self): return "" % id(self) -- cgit v1.2.1