summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_range.py6
-rw-r--r--Objects/rangeobject.c2
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;