diff -r a12da014d394 Lib/_collections_abc.py --- a/Lib/_collections_abc.py Mon Jan 05 14:39:06 2015 -0600 +++ b/Lib/_collections_abc.py Mon Jan 05 17:51:37 2015 -0600 @@ -661,13 +661,18 @@ for i in reversed(range(len(self))): yield self[i] - def index(self, value): - '''S.index(value) -> integer -- return first index of value. + def index(self, value, start=0, stop=None): + '''S.index(value, [start, [stop]]) -> integer -- return first index of value. Raises ValueError if the value is not present. ''' - for i, v in enumerate(self): - if v == value: - return i + i = start + while stop is None or i < stop: + try: + if self[i] == value: + return i + except IndexError: + break + i += 1 raise ValueError def count(self, value): diff -r a12da014d394 Lib/test/test_collections.py --- a/Lib/test/test_collections.py Mon Jan 05 14:39:06 2015 -0600 +++ b/Lib/test/test_collections.py Mon Jan 05 17:51:37 2015 -0600 @@ -614,9 +614,9 @@ class TestCollectionABCs(ABCTestCase): - # XXX For now, we only test some virtual inheritance properties. - # We should also test the proper behavior of the collection ABCs - # as real base classes or mix-in classes. + # XXX The virtual inheritance properties are tested here, but we need more + # tests for proper behavior of the collection ABCs as real base classes or + # mix-in classes. def test_Set(self): for sample in [set, frozenset]: @@ -1000,6 +1000,28 @@ self.validate_abstract_methods(Sequence, '__contains__', '__iter__', '__len__', '__getitem__') + def test_Sequence_mixins(self): + class SequenceSubclass(Sequence): + def __init__(self, seq=()): + self.seq = seq + + def __getitem__(self, index): + return self.seq[index] + + def __len__(self): + return len(self.seq) + + seq = SequenceSubclass('aab') + self.assertEqual(seq.index('a'), 0) + self.assertEqual(seq.index('a'), 0, 1) + self.assertEqual(seq.index('b'), 2) + self.assertEqual(seq.index('a', 1), 1) + self.assertRaises(ValueError, seq.index, 'a', 2) + self.assertRaises(ValueError, seq.index, 'a', 1, 1) + self.assertRaises(ValueError, seq.index, 'b', 0, 1) + + # XXX We should test the other mixin methods too. + def test_ByteString(self): for sample in [bytes, bytearray]: self.assertIsInstance(sample(), ByteString)