]> granicus.if.org Git - python/commitdiff
Make the error message for unsupported operand types cleaner, in
authorGuido van Rossum <guido@python.org>
Mon, 22 Oct 2001 04:12:44 +0000 (04:12 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 22 Oct 2001 04:12:44 +0000 (04:12 +0000)
response to a message by Laura Creighton on c.l.py.  E.g.

    >>> 0+''
    TypeError: unsupported operand types for +: 'int' and 'str'

(previously this did not mention the operand types)

    >>> ''+0
    TypeError: cannot concatenate 'str' and 'int' objects

Objects/abstract.c
Objects/stringobject.c

index 24b09f51d78f36e72cb631e1b139e7bb06ccd302..8a715c8fa286a9fb7d0df80d7f3d6bdee342cf2a 100644 (file)
@@ -383,8 +383,12 @@ binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
        PyObject *result = binary_op1(v, w, op_slot);
        if (result == Py_NotImplemented) {
                Py_DECREF(Py_NotImplemented);
-               PyErr_Format(PyExc_TypeError, 
-                               "unsupported operand type(s) for %s", op_name);
+               PyErr_Format(
+                       PyExc_TypeError, 
+                       "unsupported operand type(s) for %s: '%s' and '%s'",
+                       op_name,
+                       v->ob_type->tp_name,
+                       w->ob_type->tp_name);
                return NULL;
        }
        return result;
@@ -533,9 +537,22 @@ ternary_op(PyObject *v,
                if (c >= 0)
                        return x;
        }
-       
-       PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for %s",
-                       op_name);
+
+       if (z == Py_None)
+               PyErr_Format(
+                       PyExc_TypeError,
+                       "unsupported operand type(s) for ** or pow(): "
+                       "'%s' and '%s'",
+                       v->ob_type->tp_name,
+                       w->ob_type->tp_name);
+       else
+               PyErr_Format(
+                       PyExc_TypeError,
+                       "unsupported operand type(s) for pow(): "
+                       "'%s', '%s', '%s'",
+                       v->ob_type->tp_name,
+                       w->ob_type->tp_name,
+                       z->ob_type->tp_name);
        return NULL;
 }
 
@@ -566,8 +583,11 @@ PyNumber_Add(PyObject *v, PyObject *w)
                        result = (*m->sq_concat)(v, w);
                }
                 else {
-                    PyErr_SetString(PyExc_TypeError,
-                                    "unsupported operand types for +");
+                    PyErr_Format(
+                           PyExc_TypeError,
+                           "unsupported operand types for +: '%s' and '%s'",
+                           v->ob_type->tp_name,
+                           w->ob_type->tp_name);
                     result = NULL;
                 }
        }
index 0a3155e2975d954744d974b35bbf02e5111bc47d..74c4b5206e37d72d03e3dad606ebeb99a8517452 100644 (file)
@@ -691,7 +691,7 @@ string_concat(register PyStringObject *a, register PyObject *bb)
                    return PyUnicode_Concat((PyObject *)a, bb);
 #endif
                PyErr_Format(PyExc_TypeError,
-                            "cannot add type \"%.200s\" to string",
+                            "cannot concatenate 'str' and '%.200s' objects",
                             bb->ob_type->tp_name);
                return NULL;
        }