Fix for SF bug #117241

When a method is called with no regular arguments and * args, defer
the first arg is subclass check until after the * args have been
expanded.

N.B. The CALL_FUNCTION implementation is getting really hairy; should
review it to see if it can be simplified.
This commit is contained in:
Jeremy Hylton 2000-10-30 17:15:20 +00:00
parent 5942b439b3
commit 6b4ec5135b
2 changed files with 33 additions and 1 deletions

View File

@ -144,3 +144,21 @@ for i in range(512):
d[key] = i
a, b = f2(1, *(2, 3), **d)
print len(a), len(b), b == d
class Foo:
def method(self, arg1, arg2):
return arg1 + arg2
x = Foo()
print Foo.method(*(x, 1, 2))
print Foo.method(x, *(1, 2))
try:
print Foo.method(*(1, 2, 3))
except TypeError, err:
print err
try:
print Foo.method(1, *(2, 3))
except TypeError, err:
print err

View File

@ -1822,7 +1822,7 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
na++;
n++;
}
else {
else if (!((flags & 1) && na == 0)) {
/* Unbound methods must be called with an
instance of the class (or a derived
class) as first argument */
@ -1895,6 +1895,20 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
if (nstar < 0) {
goto extcall_fail;
}
if (class && self == NULL && na == 0) {
/* * arg is first argument of method,
so check it is isinstance of class */
self = PyTuple_GET_ITEM(stararg, 0);
if (!(PyInstance_Check(self) &&
PyClass_IsSubclass((PyObject *)
(((PyInstanceObject *)self)->in_class),
class))) {
PyErr_SetString(PyExc_TypeError,
"unbound method must be called with instance as first argument");
x = NULL;
break;
}
}
}
if (nk > 0) {
if (kwdict == NULL) {