[Python-checkins] cpython: Issue 26915: Add identity checks to the collections ABC __contains__ methods.

raymond.hettinger python-checkins at python.org
Thu May 5 04:14:16 EDT 2016


https://hg.python.org/cpython/rev/1c6cf4010df3
changeset:   101236:1c6cf4010df3
parent:      101234:3bad4b0f7612
user:        Raymond Hettinger <python at rcn.com>
date:        Thu May 05 11:14:06 2016 +0300
summary:
  Issue 26915:  Add identity checks to the collections ABC __contains__ methods.

files:
  Lib/_collections_abc.py      |   7 ++++---
  Lib/test/test_collections.py |  22 +++++++++++++++++++++-
  Misc/NEWS                    |   5 +++++
  3 files changed, 30 insertions(+), 4 deletions(-)


diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py
--- a/Lib/_collections_abc.py
+++ b/Lib/_collections_abc.py
@@ -689,7 +689,7 @@
         except KeyError:
             return False
         else:
-            return v == value
+            return v is value or v == value
 
     def __iter__(self):
         for key in self._mapping:
@@ -704,7 +704,8 @@
 
     def __contains__(self, value):
         for key in self._mapping:
-            if value == self._mapping[key]:
+            v = self._mapping[key]
+            if v is value or v == value:
                 return True
         return False
 
@@ -839,7 +840,7 @@
 
     def __contains__(self, value):
         for v in self:
-            if v == value:
+            if v is value or v == value:
                 return True
         return False
 
diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py
--- a/Lib/test/test_collections.py
+++ b/Lib/test/test_collections.py
@@ -23,7 +23,7 @@
 from collections.abc import Hashable, Iterable, Iterator, Generator, Reversible
 from collections.abc import Sized, Container, Callable
 from collections.abc import Set, MutableSet
-from collections.abc import Mapping, MutableMapping, KeysView, ItemsView
+from collections.abc import Mapping, MutableMapping, KeysView, ItemsView, ValuesView
 from collections.abc import Sequence, MutableSequence
 from collections.abc import ByteString
 
@@ -1074,6 +1074,26 @@
         self.assertFalse(ncs > cs)
         self.assertTrue(ncs >= cs)
 
+    def test_issue26915(self):
+        # Container membership test should check identity first
+        class CustomEqualObject:
+            def __eq__(self, other):
+                return False
+        class CustomSequence(list):
+            def __contains__(self, value):
+                return Sequence.__contains__(self, value)
+
+        nan = float('nan')
+        obj = CustomEqualObject()
+        containers = [
+            CustomSequence([nan, obj]),
+            ItemsView({1: nan, 2: obj}),
+            ValuesView({1: nan, 2: obj})
+        ]
+        for container in containers:
+            for elem in container:
+                self.assertIn(elem, container)
+
     def assertSameSet(self, s1, s2):
         # coerce both to a real set then check equality
         self.assertSetEqual(set(s1), set(s2))
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -268,6 +268,11 @@
 - Issue #26873: xmlrpc now raises ResponseError on unsupported type tags
   instead of silently return incorrect result.
 
+- Issue #26915:  The __contains__ methods in the collections ABCs now check
+  for identity before checking equality.  This better matches the behavior
+  of the concrete classes, allows sensible handling of NaNs, and makes it
+  easier to reason about container invariants.
+
 - Issue #26711: Fixed the comparison of plistlib.Data with other types.
 
 - Issue #24114: Fix an uninitialized variable in `ctypes.util`.

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list