]> granicus.if.org Git - python/commitdiff
Subclasses of int/long are allowed to define an __index__.
authorNeal Norwitz <nnorwitz@gmail.com>
Tue, 15 Aug 2006 06:29:03 +0000 (06:29 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Tue, 15 Aug 2006 06:29:03 +0000 (06:29 +0000)
Lib/test/test_index.py
Objects/abstract.c

index 6ad7d5e79b0a91e9116a79a7a188215130cd6d38..ecb566d5d58235db76e9198b5cded208f4c76e8c 100644 (file)
@@ -48,11 +48,12 @@ class BaseTestCase(unittest.TestCase):
         self.assertEqual(self.o.__index__(), 4)
         self.assertEqual(self.n.__index__(), 5)
 
-    def test_infinite_recursion(self):
-        self.failUnlessRaises(TypeError, operator.index, TrapInt())
-        self.failUnlessRaises(TypeError, operator.index, TrapLong())
-        self.failUnless(slice(TrapInt()).indices(0)==(0,0,1))
-        self.failUnlessRaises(TypeError, slice(TrapLong()).indices, 0)
+    def test_subclasses(self):
+        r = range(10)
+        self.assertEqual(r[TrapInt(5):TrapInt(10)], r[5:10])
+        self.assertEqual(r[TrapLong(5):TrapLong(10)], r[5:10])
+        self.assertEqual(slice(TrapInt()).indices(0), (0,0,1))
+        self.assertEqual(slice(TrapLong(0)).indices(0), (0,0,1))
 
     def test_error(self):
         self.o.ind = 'dumb'
@@ -104,9 +105,9 @@ class SeqTestCase(unittest.TestCase):
         self.assertEqual(self.seq.__mul__(self.n), self.seq * 5)
         self.assertEqual(self.seq.__rmul__(self.n), self.seq * 5)
 
-    def test_infinite_recursion(self):
-        self.failUnlessRaises(TypeError, operator.getitem, self.seq, TrapInt())
-        self.failUnlessRaises(TypeError, operator.getitem, self.seq, TrapLong())
+    def test_subclasses(self):
+        self.assertEqual(self.seq[TrapInt()], self.seq[0])
+        self.assertEqual(self.seq[TrapLong()], self.seq[0])
 
     def test_error(self):
         self.o.ind = 'dumb'
index c8e9ddcf4942958474a41cb476127a4cf90f994a..a18bb787eaba9bea167f4d0ddfbc7bb84ccc532a 100644 (file)
@@ -945,16 +945,14 @@ PyNumber_Index(PyObject *item)
        PyObject *result = NULL;
        if (item == NULL)
                return null_error();
-       /* XXX(nnorwitz): should these be CheckExact?  Aren't subclasses ok? */
-       if (PyInt_CheckExact(item) || PyLong_CheckExact(item)) {
+       if (PyInt_Check(item) || PyLong_Check(item)) {
                Py_INCREF(item);
                return item;
        }
        if (PyIndex_Check(item)) {
                result = item->ob_type->tp_as_number->nb_index(item);
-               /* XXX(nnorwitz): Aren't subclasses ok here too? */
                if (result &&
-                   !PyInt_CheckExact(result) && !PyLong_CheckExact(result)) {
+                   !PyInt_Check(result) && !PyLong_Check(result)) {
                        PyErr_Format(PyExc_TypeError,
                                     "__index__ returned non-(int,long) " \
                                     "(type %.200s)",