Issue #5647: MutableSet.__iand__() no longer mutates self during iteration.
This commit is contained in:
parent
0759dd66c5
commit
3f10a952f6
|
@ -320,9 +320,8 @@ class MutableSet(Set):
|
||||||
self.add(value)
|
self.add(value)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def __iand__(self, c: Container):
|
def __iand__(self, it: Iterable):
|
||||||
for value in self:
|
for value in (self - it):
|
||||||
if value not in c:
|
|
||||||
self.discard(value)
|
self.discard(value)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
|
|
@ -327,6 +327,25 @@ class TestOneTrickPonyABCs(ABCTestCase):
|
||||||
B.register(C)
|
B.register(C)
|
||||||
self.failUnless(issubclass(C, B))
|
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):
|
class TestCollectionABCs(ABCTestCase):
|
||||||
|
|
||||||
|
@ -363,6 +382,12 @@ class TestCollectionABCs(ABCTestCase):
|
||||||
self.validate_abstract_methods(MutableSet, '__contains__', '__iter__', '__len__',
|
self.validate_abstract_methods(MutableSet, '__contains__', '__iter__', '__len__',
|
||||||
'add', 'discard')
|
'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):
|
def test_issue_4920(self):
|
||||||
# MutableSet.pop() method did not work
|
# MutableSet.pop() method did not work
|
||||||
class MySet(collections.MutableSet):
|
class MySet(collections.MutableSet):
|
||||||
|
|
|
@ -55,6 +55,8 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #5647: MutableSet.__iand__() no longer mutates self during iteration.
|
||||||
|
|
||||||
- Issue #5624: Fix the _winreg module name still used in several modules.
|
- Issue #5624: Fix the _winreg module name still used in several modules.
|
||||||
|
|
||||||
- Issue #5628: Fix io.TextIOWrapper.read() with a unreadable buffer.
|
- Issue #5628: Fix io.TextIOWrapper.read() with a unreadable buffer.
|
||||||
|
|
Loading…
Reference in New Issue