mirror of https://github.com/python/cpython
bpo-26915: Test identity first in membership operation in index() and count() methods of collections.abc.Sequence (GH-503)
This commit is contained in:
parent
8f6b344d36
commit
d5d3249e8a
|
@ -908,7 +908,8 @@ class Sequence(Reversible, Collection):
|
|||
i = start
|
||||
while stop is None or i < stop:
|
||||
try:
|
||||
if self[i] == value:
|
||||
v = self[i]
|
||||
if v is value or v == value:
|
||||
return i
|
||||
except IndexError:
|
||||
break
|
||||
|
@ -917,7 +918,7 @@ class Sequence(Reversible, Collection):
|
|||
|
||||
def count(self, value):
|
||||
'S.count(value) -> integer -- return number of occurrences of value'
|
||||
return sum(1 for v in self if v == value)
|
||||
return sum(1 for v in self if v is value or v == value)
|
||||
|
||||
Sequence.register(tuple)
|
||||
Sequence.register(str)
|
||||
|
|
|
@ -1309,20 +1309,29 @@ class TestCollectionABCs(ABCTestCase):
|
|||
class CustomEqualObject:
|
||||
def __eq__(self, other):
|
||||
return False
|
||||
class CustomSequence(list):
|
||||
def __contains__(self, value):
|
||||
return Sequence.__contains__(self, value)
|
||||
class CustomSequence(Sequence):
|
||||
def __init__(self, seq):
|
||||
self._seq = seq
|
||||
def __getitem__(self, index):
|
||||
return self._seq[index]
|
||||
def __len__(self):
|
||||
return len(self._seq)
|
||||
|
||||
nan = float('nan')
|
||||
obj = CustomEqualObject()
|
||||
seq = CustomSequence([nan, obj, nan])
|
||||
containers = [
|
||||
CustomSequence([nan, obj]),
|
||||
seq,
|
||||
ItemsView({1: nan, 2: obj}),
|
||||
ValuesView({1: nan, 2: obj})
|
||||
]
|
||||
for container in containers:
|
||||
for elem in container:
|
||||
self.assertIn(elem, container)
|
||||
self.assertEqual(seq.index(nan), 0)
|
||||
self.assertEqual(seq.index(obj), 1)
|
||||
self.assertEqual(seq.count(nan), 2)
|
||||
self.assertEqual(seq.count(obj), 1)
|
||||
|
||||
def assertSameSet(self, s1, s2):
|
||||
# coerce both to a real set then check equality
|
||||
|
|
|
@ -265,6 +265,9 @@ Extension Modules
|
|||
Library
|
||||
-------
|
||||
|
||||
- bpo-26915: index() and count() methods of collections.abc.Sequence now
|
||||
check identity before checking equality when do comparisons.
|
||||
|
||||
- bpo-28682: Added support for bytes paths in os.fwalk().
|
||||
|
||||
- bpo-29623: Allow use of path-like object as a single argument in
|
||||
|
|
Loading…
Reference in New Issue