Skip to content

Commit 6c08adb

Browse files
gh-137463: Update validate_abstract_methods in test_collections.py (#137464)
Update `validate_abstract_methods` in `test_collections.py` The test for missing abstract methods in `validate_abstract_methods` incorrectly attempted to instantiate the generated class `C` with an argument (`C(name)`), which always raises a `TypeError: C() takes no arguments`. Although the test originally passes, it passes for the wrong reason. This change makes the test correctly validate the enforcement of abstract methods in ABCs. (cherry picked from commit 5be8723)
1 parent 8905f7a commit 6c08adb

File tree

1 file changed

+16
-18
lines changed

1 file changed

+16
-18
lines changed

Lib/test/test_collections.py

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,7 @@ def validate_abstract_methods(self, abc, *names):
736736
stubs = methodstubs.copy()
737737
del stubs[name]
738738
C = type('C', (abc,), stubs)
739-
self.assertRaises(TypeError, C, name)
739+
self.assertRaises(TypeError, C)
740740

741741
def validate_isinstance(self, abc, name):
742742
stub = lambda s, *args: 0
@@ -963,7 +963,7 @@ class AnextOnly:
963963
async def __anext__(self):
964964
raise StopAsyncIteration
965965
self.assertNotIsInstance(AnextOnly(), AsyncIterator)
966-
self.validate_abstract_methods(AsyncIterator, '__anext__', '__aiter__')
966+
self.validate_abstract_methods(AsyncIterator, '__anext__')
967967

968968
def test_Iterable(self):
969969
# Check some non-iterables
@@ -1159,8 +1159,8 @@ def test_Iterator(self):
11591159
]
11601160
for x in samples:
11611161
self.assertIsInstance(x, Iterator)
1162-
self.assertTrue(issubclass(type(x), Iterator), repr(type(x)))
1163-
self.validate_abstract_methods(Iterator, '__next__', '__iter__')
1162+
self.assertIsSubclass(type(x), Iterator)
1163+
self.validate_abstract_methods(Iterator, '__next__')
11641164

11651165
# Issue 10565
11661166
class NextOnly:
@@ -1843,9 +1843,8 @@ def test_Set_hash_matches_frozenset(self):
18431843
def test_Mapping(self):
18441844
for sample in [dict]:
18451845
self.assertIsInstance(sample(), Mapping)
1846-
self.assertTrue(issubclass(sample, Mapping))
1847-
self.validate_abstract_methods(Mapping, '__contains__', '__iter__', '__len__',
1848-
'__getitem__')
1846+
self.assertIsSubclass(sample, Mapping)
1847+
self.validate_abstract_methods(Mapping, '__iter__', '__len__', '__getitem__')
18491848
class MyMapping(Mapping):
18501849
def __len__(self):
18511850
return 0
@@ -1859,8 +1858,8 @@ def __iter__(self):
18591858
def test_MutableMapping(self):
18601859
for sample in [dict]:
18611860
self.assertIsInstance(sample(), MutableMapping)
1862-
self.assertTrue(issubclass(sample, MutableMapping))
1863-
self.validate_abstract_methods(MutableMapping, '__contains__', '__iter__', '__len__',
1861+
self.assertIsSubclass(sample, MutableMapping)
1862+
self.validate_abstract_methods(MutableMapping, '__iter__', '__len__',
18641863
'__getitem__', '__setitem__', '__delitem__')
18651864

18661865
def test_MutableMapping_subclass(self):
@@ -1897,10 +1896,9 @@ def test_Sequence(self):
18971896
self.assertIsInstance(range(10), Sequence)
18981897
self.assertTrue(issubclass(range, Sequence))
18991898
self.assertIsInstance(memoryview(b""), Sequence)
1900-
self.assertTrue(issubclass(memoryview, Sequence))
1901-
self.assertTrue(issubclass(str, Sequence))
1902-
self.validate_abstract_methods(Sequence, '__contains__', '__iter__', '__len__',
1903-
'__getitem__')
1899+
self.assertIsSubclass(memoryview, Sequence)
1900+
self.assertIsSubclass(str, Sequence)
1901+
self.validate_abstract_methods(Sequence, '__len__', '__getitem__')
19041902

19051903
def test_Sequence_mixins(self):
19061904
class SequenceSubclass(Sequence):
@@ -1974,11 +1972,11 @@ def test_MutableSequence(self):
19741972
self.assertFalse(issubclass(sample, MutableSequence))
19751973
for sample in [list, bytearray, deque]:
19761974
self.assertIsInstance(sample(), MutableSequence)
1977-
self.assertTrue(issubclass(sample, MutableSequence))
1978-
self.assertTrue(issubclass(array.array, MutableSequence))
1979-
self.assertFalse(issubclass(str, MutableSequence))
1980-
self.validate_abstract_methods(MutableSequence, '__contains__', '__iter__',
1981-
'__len__', '__getitem__', '__setitem__', '__delitem__', 'insert')
1975+
self.assertIsSubclass(sample, MutableSequence)
1976+
self.assertIsSubclass(array.array, MutableSequence)
1977+
self.assertNotIsSubclass(str, MutableSequence)
1978+
self.validate_abstract_methods(MutableSequence, '__len__', '__getitem__',
1979+
'__setitem__', '__delitem__', 'insert')
19821980

19831981
def test_MutableSequence_mixins(self):
19841982
# Test the mixins of MutableSequence by creating a minimal concrete

0 commit comments

Comments
 (0)