diff options
-rw-r--r-- | Lib/test/test_range.py | 6 | ||||
-rw-r--r-- | Objects/rangeobject.c | 2 |
2 files changed, 7 insertions, 1 deletions
diff --git a/Lib/test/test_range.py b/Lib/test/test_range.py index 1a40dd1..638d943 100644 --- a/Lib/test/test_range.py +++ b/Lib/test/test_range.py @@ -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) diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index 213f3dd..beff030 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -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; |