aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWalter Dörwald <walter@livinglogic.de>2002-12-12 19:14:08 +0000
committerWalter Dörwald <walter@livinglogic.de>2002-12-12 19:14:08 +0000
commit7e5c6a02eba1a6f5e93bfa1241ceff39bec9f3c9 (patch)
tree503cd8986a6ced722156e1e4eda5accd6e8bc9e8
parentMention the bdist_wininst postinstall script. (diff)
downloadcpython-7e5c6a02eba1a6f5e93bfa1241ceff39bec9f3c9.tar.gz
cpython-7e5c6a02eba1a6f5e93bfa1241ceff39bec9f3c9.tar.bz2
cpython-7e5c6a02eba1a6f5e93bfa1241ceff39bec9f3c9.zip
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 1bb09a6edc3..5a19387ab9c 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 47d2f31dd7f..8389774e2fa 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 f3b98733de0..5234a658a24 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;