summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Dörwald <walter@livinglogic.de>2002-12-12 19:14:08 (GMT)
committerWalter Dörwald <walter@livinglogic.de>2002-12-12 19:14:08 (GMT)
commit7e5c6a02eba1a6f5e93bfa1241ceff39bec9f3c9 (patch)
tree503cd8986a6ced722156e1e4eda5accd6e8bc9e8
parent1b3b49d1325475bc54743125ee5e519c62fc45f1 (diff)
downloadcpython-7e5c6a02eba1a6f5e93bfa1241ceff39bec9f3c9.zip
cpython-7e5c6a02eba1a6f5e93bfa1241ceff39bec9f3c9.tar.gz
cpython-7e5c6a02eba1a6f5e93bfa1241ceff39bec9f3c9.tar.bz2
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.
-rw-r--r--Lib/test/test_isinstance.py19
-rw-r--r--Objects/abstract.c8
-rw-r--r--Objects/classobject.c3
3 files changed, 24 insertions, 6 deletions
diff --git a/Lib/test/test_isinstance.py b/Lib/test/test_isinstance.py
index 1bb09a6..5a19387 100644
--- a/Lib/test/test_isinstance.py
+++ b/Lib/test/test_isinstance.py
@@ -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))))
diff --git a/Objects/abstract.c b/Objects/abstract.c
index 47d2f31..8389774 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -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,
diff --git a/Objects/classobject.c b/Objects/classobject.c
index f3b9873..5234a65 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -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;