From: Raymond Hettinger Date: Wed, 1 Apr 2009 19:03:30 +0000 (+0000) Subject: Issue #5647: MutableSet.__iand__() no longer mutates self during iteration. X-Git-Tag: 3.0~275 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9629cc9b8a769728ab7fd111fae48cde5d72dfa4;p=thirdparty%2FPython%2Fcpython.git Issue #5647: MutableSet.__iand__() no longer mutates self during iteration. --- diff --git a/Lib/_abcoll.py b/Lib/_abcoll.py index c7636ec80e6f..73966dbce6b6 100644 --- a/Lib/_abcoll.py +++ b/Lib/_abcoll.py @@ -320,10 +320,9 @@ class MutableSet(Set): self.add(value) return self - def __iand__(self, c: Container): - for value in self: - if value not in c: - self.discard(value) + def __iand__(self, it: Iterable): + for value in (self - it): + self.discard(value) return self def __ixor__(self, it: Iterable): diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index ce886521a639..0c8f7ff246c0 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -312,6 +312,25 @@ class TestOneTrickPonyABCs(ABCTestCase): B.register(C) self.failUnless(issubclass(C, B)) +class WithSet(MutableSet): + + def __init__(self, it=()): + self.data = set(it) + + def __len__(self): + return len(self.data) + + def __iter__(self): + return iter(self.data) + + def __contains__(self, item): + return item in self.data + + def add(self, item): + self.data.add(item) + + def discard(self, item): + self.data.discard(item) class TestCollectionABCs(ABCTestCase): @@ -348,6 +367,12 @@ class TestCollectionABCs(ABCTestCase): self.validate_abstract_methods(MutableSet, '__contains__', '__iter__', '__len__', 'add', 'discard') + def test_issue_5647(self): + # MutableSet.__iand__ mutated the set during iteration + s = WithSet('abcd') + s &= WithSet('cdef') # This used to fail + self.assertEqual(set(s), set('cd')) + def test_issue_4920(self): # MutableSet.pop() method did not work class MySet(collections.MutableSet): diff --git a/Misc/NEWS b/Misc/NEWS index 95bbb53c5b28..3426a6f73189 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -33,6 +33,8 @@ Library - Issue #5619: Multiprocessing children disobey the debug flag and causes popups on windows buildbots. Patch applied to work around this issue. +- Issue #5647: MutableSet.__iand__() no longer mutates self during iteration. + - Issue #5387: Fixed mmap.move crash by integer overflow. - Issue #5595: Fix UnboundedLocalError in ntpath.ismount().