]> granicus.if.org Git - python/commitdiff
Issue #1766304: The range.__contains__ optimization should only be
authorMark Dickinson <dickinsm@gmail.com>
Thu, 24 Sep 2009 20:04:23 +0000 (20:04 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Thu, 24 Sep 2009 20:04:23 +0000 (20:04 +0000)
applied to ints, not to instances of subclasses of int.

Lib/test/test_range.py
Objects/rangeobject.c

index 1a40dd12967ea8acd3f232bb572b7c874b77b374..638d94377c9e092864d6e8851790a6a00dbd68dc 100644 (file)
@@ -97,6 +97,12 @@ class RangeTest(unittest.TestCase):
         # ..except if explicitly told so.
         self.assertTrue(int(C2()) in range(3))
 
+        # Check that the range.__contains__ optimization is only
+        # used for ints, not for instances of subclasses of int.
+        class C3(int):
+            def __eq__(self, other): return True
+        self.assertTrue(C3(11) in range(10))
+        self.assertTrue(C3(11) in list(range(10)))
 
     def test_strided_limits(self):
         r = range(0, 101, 2)
index 213f3dd382836666024aa5a4825a147e7040635f..beff030eba48dccc4845bbf996ca060fbe672e92 100644 (file)
@@ -275,7 +275,7 @@ range_reduce(rangeobject *r, PyObject *args)
 
 static int
 range_contains(rangeobject *r, PyObject *ob) {
-    if (PyLong_Check(ob)) {
+    if (PyLong_CheckExact(ob) || PyBool_Check(ob)) {
         int cmp1, cmp2, cmp3;
         PyObject *tmp1 = NULL;
         PyObject *tmp2 = NULL;