Issue #1766304: The range.__contains__ optimization should only be

applied to ints, not to instances of subclasses of int.
This commit is contained in:
Mark Dickinson 2009-09-24 20:04:23 +00:00
parent 067b38eed4
commit 418f81d9b6
2 changed files with 7 additions and 1 deletions

View File

@ -97,6 +97,12 @@ class RangeTest(unittest.TestCase):
# ..except if explicitly told so. # ..except if explicitly told so.
self.assertTrue(int(C2()) in range(3)) 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): def test_strided_limits(self):
r = range(0, 101, 2) r = range(0, 101, 2)

View File

@ -275,7 +275,7 @@ range_reduce(rangeobject *r, PyObject *args)
static int static int
range_contains(rangeobject *r, PyObject *ob) { range_contains(rangeobject *r, PyObject *ob) {
if (PyLong_Check(ob)) { if (PyLong_CheckExact(ob) || PyBool_Check(ob)) {
int cmp1, cmp2, cmp3; int cmp1, cmp2, cmp3;
PyObject *tmp1 = NULL; PyObject *tmp1 = NULL;
PyObject *tmp2 = NULL; PyObject *tmp2 = NULL;