mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
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:
parent
5942b439b3
commit
6b4ec5135b
2 changed files with 33 additions and 1 deletions
|
@ -144,3 +144,21 @@ for i in range(512):
|
||||||
d[key] = i
|
d[key] = i
|
||||||
a, b = f2(1, *(2, 3), **d)
|
a, b = f2(1, *(2, 3), **d)
|
||||||
print len(a), len(b), b == 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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1822,7 +1822,7 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
|
||||||
na++;
|
na++;
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
else {
|
else if (!((flags & 1) && na == 0)) {
|
||||||
/* Unbound methods must be called with an
|
/* Unbound methods must be called with an
|
||||||
instance of the class (or a derived
|
instance of the class (or a derived
|
||||||
class) as first argument */
|
class) as first argument */
|
||||||
|
@ -1895,6 +1895,20 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
|
||||||
if (nstar < 0) {
|
if (nstar < 0) {
|
||||||
goto extcall_fail;
|
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 (nk > 0) {
|
||||||
if (kwdict == NULL) {
|
if (kwdict == NULL) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue