bpo-26915: Test identity first in index() and count() of collections.abc.Sequence (GH-553)

This commit is contained in:
Xiang Zhang 2017-03-08 11:43:35 +08:00 committed by GitHub
parent 23b26c4e20
commit 78ad039bcf
3 changed files with 19 additions and 6 deletions

View file

@ -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)

View file

@ -1310,20 +1310,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

View file

@ -16,6 +16,9 @@ Core and Builtins
Library
-------
- bpo-26915: index() and count() methods of collections.abc.Sequence now
check identity before checking equality when do comparisons.
- bpo-29615: SimpleXMLRPCDispatcher no longer chains KeyError (or any other
exception) to exception(s) raised in the dispatched methods.
Patch by Petr Motejlek.