Kaydet (Commit) 3f10a952 authored tarafından Raymond Hettinger's avatar Raymond Hettinger

Issue #5647: MutableSet.__iand__() no longer mutates self during iteration.

üst 0759dd66
......@@ -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):
......
......@@ -327,6 +327,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):
......@@ -363,6 +382,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):
......
......@@ -55,6 +55,8 @@ Core and Builtins
Library
-------
- Issue #5647: MutableSet.__iand__() no longer mutates self during iteration.
- Issue #5624: Fix the _winreg module name still used in several modules.
- Issue #5628: Fix io.TextIOWrapper.read() with a unreadable buffer.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment