Change issubclass() so that recursive tuples (directly or indirectly

containing class objects) are allowed as the second argument.
This makes issubclass() more similar to isinstance() where recursive
tuples are allowed too.
This commit is contained in:
Walter Dörwald 2002-12-12 19:14:08 +00:00
parent 1b3b49d132
commit 7e5c6a02eb
3 changed files with 24 additions and 6 deletions

View File

@ -165,6 +165,13 @@ class Super:
class Child(Super):
pass
# new-style classes
class NewSuper(object):
pass
class NewChild(NewSuper):
pass
class TestIsInstanceIsSubclass(unittest.TestCase):
@ -225,7 +232,17 @@ class TestIsInstanceIsSubclass(unittest.TestCase):
self.assertEqual(False, issubclass(Super, (Child,)))
self.assertEqual(True, issubclass(Super, (Child, Super)))
self.assertEqual(False, issubclass(Child, ()))
self.assertRaises(TypeError, issubclass, Child, ((Child,),))
self.assertEqual(True, issubclass(Super, (Child, (Super,))))
self.assertEqual(True, issubclass(NewChild, (NewChild,)))
self.assertEqual(True, issubclass(NewChild, (NewSuper,)))
self.assertEqual(False, issubclass(NewSuper, (NewChild,)))
self.assertEqual(True, issubclass(NewSuper, (NewChild, NewSuper)))
self.assertEqual(False, issubclass(NewChild, ()))
self.assertEqual(True, issubclass(NewSuper, (NewChild, (NewSuper,))))
self.assertEqual(True, issubclass(int, (long, (float, int))))
self.assertEqual(True, issubclass(str, (unicode, (Child, NewChild, basestring))))

View File

@ -2021,11 +2021,11 @@ PyObject_IsSubclass(PyObject *derived, PyObject *cls)
int i;
int n = PyTuple_GET_SIZE(cls);
for (i = 0; i < n; ++i) {
if (!check_class(PyTuple_GET_ITEM(cls, i),
"issubclass() arg 2 must be a class"
" or tuple of classes"))
return -1;
retval = PyObject_IsSubclass(derived, PyTuple_GET_ITEM(cls, i));
if (retval != 0) /* either found it, or got an error */
return retval;
}
return 0;
}
else {
if (!check_class(cls,

View File

@ -490,9 +490,10 @@ PyClass_IsSubclass(PyObject *class, PyObject *base)
if (PyTuple_Check(base)) {
n = PyTuple_GET_SIZE(base);
for (i = 0; i < n; i++) {
if (class == PyTuple_GET_ITEM(base, i))
if (PyClass_IsSubclass(class, PyTuple_GET_ITEM(base, i)))
return 1;
}
return 0;
}
if (class == NULL || !PyClass_Check(class))
return 0;