]> granicus.if.org Git - python/commitdiff
bpo-26915: Test identity first in membership operation in index() and count() methods...
authorXiang Zhang <angwerzx@126.com>
Wed, 8 Mar 2017 03:04:24 +0000 (11:04 +0800)
committerGitHub <noreply@github.com>
Wed, 8 Mar 2017 03:04:24 +0000 (11:04 +0800)
Lib/_collections_abc.py
Lib/test/test_collections.py
Misc/NEWS

index b172f3f360e6ef5c98b69c187caa33a28b1f56fb..005d884572465f261f9f6186a4e5817f8754df92 100644 (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)
index 76c71392dd372af154fbba3acb9870be9f19fb8b..87c697863ed94ef2812b8bcab8b982972ac431a2 100644 (file)
@@ -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
index 6f998e8dc7869bc20d70fbb67c5ae761019012f7..b5437e58932d9c5e0566c7868f3e12f02cb983bf 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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