Skip to content

Commit ca122db

Browse files
committed
bpo-26915: Test identity first in membership operation in index() and count() methods of collections.abc.Sequence (pythonGH-503)
1 parent 23b26c4 commit ca122db

File tree

3 files changed

+793
-6
lines changed

3 files changed

+793
-6
lines changed

Lib/_collections_abc.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -908,7 +908,8 @@ def index(self, value, start=0, stop=None):
908908
i = start
909909
while stop is None or i < stop:
910910
try:
911-
if self[i] == value:
911+
v = self[i]
912+
if v is value or v == value:
912913
return i
913914
except IndexError:
914915
break
@@ -917,7 +918,7 @@ def index(self, value, start=0, stop=None):
917918

918919
def count(self, value):
919920
'S.count(value) -> integer -- return number of occurrences of value'
920-
return sum(1 for v in self if v == value)
921+
return sum(1 for v in self if v is value or v == value)
921922

922923
Sequence.register(tuple)
923924
Sequence.register(str)

Lib/test/test_collections.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1310,20 +1310,29 @@ def test_issue26915(self):
13101310
class CustomEqualObject:
13111311
def __eq__(self, other):
13121312
return False
1313-
class CustomSequence(list):
1314-
def __contains__(self, value):
1315-
return Sequence.__contains__(self, value)
1313+
class CustomSequence(Sequence):
1314+
def __init__(self, seq):
1315+
self._seq = seq
1316+
def __getitem__(self, index):
1317+
return self._seq[index]
1318+
def __len__(self):
1319+
return len(self._seq)
13161320

13171321
nan = float('nan')
13181322
obj = CustomEqualObject()
1323+
seq = CustomSequence([nan, obj, nan])
13191324
containers = [
1320-
CustomSequence([nan, obj]),
1325+
seq,
13211326
ItemsView({1: nan, 2: obj}),
13221327
ValuesView({1: nan, 2: obj})
13231328
]
13241329
for container in containers:
13251330
for elem in container:
13261331
self.assertIn(elem, container)
1332+
self.assertEqual(seq.index(nan), 0)
1333+
self.assertEqual(seq.index(obj), 1)
1334+
self.assertEqual(seq.count(nan), 2)
1335+
self.assertEqual(seq.count(obj), 1)
13271336

13281337
def assertSameSet(self, s1, s2):
13291338
# coerce both to a real set then check equality

0 commit comments

Comments
 (0)