diff options
author | Tim Peters <tim.peters@gmail.com> | 2003-05-25 01:45:11 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2003-05-25 01:45:11 (GMT) |
commit | 886128f4f8b30b7e3623418eab063a3a8dd3495c (patch) | |
tree | 4f4e74b0d3fcd6251c52ca8419f0b1eff178ff22 /Lib/weakref.py | |
parent | 6f805942290b8d83f0e229de98c8d0d7a2a7c3e8 (diff) | |
download | cpython-886128f4f8b30b7e3623418eab063a3a8dd3495c.zip cpython-886128f4f8b30b7e3623418eab063a3a8dd3495c.tar.gz cpython-886128f4f8b30b7e3623418eab063a3a8dd3495c.tar.bz2 |
SF 742860: WeakKeyDictionary __delitem__ uses iterkeys
Someone review this, please! Final releases are getting close, Fred
(the weakref guy) won't be around until Tuesday, and the pre-patch
code can indeed raise spurious RuntimeErrors in the presence of
threads or mutating comparison functions.
See the bug report for my confusions: I can't see any reason for why
__delitem__ iterated over the keys. The new one-liner implementation
is much faster, can't raise RuntimeError, and should be better-behaved
in all respects wrt threads.
New tests test_weak_keyed_bad_delitem and
test_weak_keyed_cascading_deletes fail before this patch.
Bugfix candidate for 2.2.3 too, if someone else agrees with this patch.
Diffstat (limited to 'Lib/weakref.py')
-rw-r--r-- | Lib/weakref.py | 6 |
1 files changed, 1 insertions, 5 deletions
diff --git a/Lib/weakref.py b/Lib/weakref.py index 838ff5e..09bed65 100644 --- a/Lib/weakref.py +++ b/Lib/weakref.py @@ -164,11 +164,7 @@ class WeakKeyDictionary(UserDict.UserDict): if dict is not None: self.update(dict) def __delitem__(self, key): - for ref in self.data.iterkeys(): - o = ref() - if o == key: - del self.data[ref] - return + del self.data[ref(key)] def __getitem__(self, key): return self.data[ref(key)] |