Skip to content

Commit d5d3249

Browse files
authored
bpo-26915: Test identity first in membership operation in index() and count() methods of collections.abc.Sequence (pythonGH-503)
1 parent 8f6b344 commit d5d3249

3 files changed

Lines changed: 19 additions & 6 deletions

File tree

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
@@ -1309,20 +1309,29 @@ def test_issue26915(self):
13091309
class CustomEqualObject:
13101310
def __eq__(self, other):
13111311
return False
1312-
class CustomSequence(list):
1313-
def __contains__(self, value):
1314-
return Sequence.__contains__(self, value)
1312+
class CustomSequence(Sequence):
1313+
def __init__(self, seq):
1314+
self._seq = seq
1315+
def __getitem__(self, index):
1316+
return self._seq[index]
1317+
def __len__(self):
1318+
return len(self._seq)
13151319

13161320
nan = float('nan')
13171321
obj = CustomEqualObject()
1322+
seq = CustomSequence([nan, obj, nan])
13181323
containers = [
1319-
CustomSequence([nan, obj]),
1324+
seq,
13201325
ItemsView({1: nan, 2: obj}),
13211326
ValuesView({1: nan, 2: obj})
13221327
]
13231328
for container in containers:
13241329
for elem in container:
13251330
self.assertIn(elem, container)
1331+
self.assertEqual(seq.index(nan), 0)
1332+
self.assertEqual(seq.index(obj), 1)
1333+
self.assertEqual(seq.count(nan), 2)
1334+
self.assertEqual(seq.count(obj), 1)
13261335

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

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,9 @@ Extension Modules
265265
Library
266266
-------
267267

268+
- bpo-26915: index() and count() methods of collections.abc.Sequence now
269+
check identity before checking equality when do comparisons.
270+
268271
- bpo-28682: Added support for bytes paths in os.fwalk().
269272

270273
- bpo-29623: Allow use of path-like object as a single argument in

0 commit comments

Comments
 (0)