]> granicus.if.org Git - python/commitdiff
Implement isinstance(x, (A, B, ...)). Note that we only allow tuples,
authorGuido van Rossum <guido@python.org>
Sun, 7 Oct 2001 20:54:12 +0000 (20:54 +0000)
committerGuido van Rossum <guido@python.org>
Sun, 7 Oct 2001 20:54:12 +0000 (20:54 +0000)
not other sequences (then we'd have to except strings, and we'd still
be susceptible to recursive attacks).

Objects/abstract.c
Python/bltinmodule.c

index 4891622a72252e644a60369a0c54a4a5f243f3f6..33991a81cb2a1e65731baff36621ee27eb31260c 100644 (file)
@@ -1805,6 +1805,20 @@ PyObject_IsInstance(PyObject *inst, PyObject *cls)
        else if (PyType_Check(cls)) {
                retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
        }
+       else if (PyTuple_Check(cls)) {
+               /* Not a general sequence -- that opens up the road to
+                  recursion and stack overflow. */
+               int i, n;
+
+               n = PyTuple_GET_SIZE(cls);
+               for (i = 0; i < n; i++) {
+                       retval = PyObject_IsInstance(
+                               inst, PyTuple_GET_ITEM(cls, i));
+                       if (retval != 0)
+                               break;
+               }
+               return retval;
+       }
        else if (!PyInstance_Check(inst)) {
                if (__class__ == NULL) {
                        __class__ = PyString_FromString("__class__");
@@ -1827,7 +1841,8 @@ PyObject_IsInstance(PyObject *inst, PyObject *cls)
 
        if (retval < 0) {
                PyErr_SetString(PyExc_TypeError,
-                               "isinstance() arg 2 must be a class or type");
+                               "isinstance() arg 2 must be a class or type "
+                               "or tuple of those");
        }
        return retval;
 }
index 64afb1ba22620b69a468fe72ecf26d310d80b009..8390b7b80b982d2a5a400baf7a98928df3c4c880 100644 (file)
@@ -1641,10 +1641,12 @@ builtin_isinstance(PyObject *self, PyObject *args)
 }
 
 static char isinstance_doc[] =
-"isinstance(object, class-or-type) -> Boolean\n\
+"isinstance(object, class-or-type-or-tuple) -> Boolean\n\
 \n\
 Return whether an object is an instance of a class or of a subclass thereof.\n\
-With a type as second argument, return whether that is the object's type.";
+With a type as second argument, return whether that is the object's type.\n\
+The form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for\n\
+isinstance(x, A) or isinstance(x, B) or ... (etc.).";
 
 
 static PyObject *