Improve the error message issued when an unbound method is called with

an inappropriate first argument.  Now that there are more ways for
this to fail, make sure to report the name of the class of the
expected instance and of the actual instance.
This commit is contained in:
Guido van Rossum 2001-08-24 18:48:27 +00:00
parent 1e2775f370
commit a15dece519

View File

@ -2127,6 +2127,48 @@ instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
return 0;
}
static char *
getclassname(PyObject *class)
{
PyObject *name;
if (class == NULL)
name = NULL;
else
name = PyObject_GetAttrString(class, "__name__");
if (name == NULL) {
PyErr_Clear();
return "?";
}
if (!PyString_Check(name)) {
Py_DECREF(name);
return "?";
}
PyString_InternInPlace(&name);
Py_DECREF(name);
return PyString_AS_STRING(name);
}
static char *
getinstclassname(PyObject *inst)
{
PyObject *class;
char *name;
if (inst == NULL)
return "nothing";
class = PyObject_GetAttrString(inst, "__class__");
if (class == NULL) {
PyErr_Clear();
class = (PyObject *)(inst->ob_type);
Py_INCREF(class);
}
name = getclassname(class);
Py_XDECREF(class);
return name;
}
static PyObject *
instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
{
@ -2150,10 +2192,14 @@ instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
}
if (!ok) {
PyErr_Format(PyExc_TypeError,
"unbound method %s%s must be "
"called with instance as first argument",
"unbound method %s%s must be called with "
"%s instance as first argument "
"(got %s%s instead)",
PyEval_GetFuncName(func),
PyEval_GetFuncDesc(func));
PyEval_GetFuncDesc(func),
getclassname(class),
getinstclassname(self),
self == NULL ? "" : " instance");
return NULL;
}
Py_INCREF(arg);