When implementing keyword argument support for Boost.Python, I noticed the following. I'm sure it's not worth a lot of effort to change this behavior, but I thought someone might like to know:
class X: ... def foo(self, y): print y ... X.foo(y = 1, self = X()) Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: unbound method foo() must be called with X instance as first argument (got nothing instead)
You can't pass in self to an unbound method as a keyword argument -- it has to be the first positional argument. The unbound method __call__ implementation contains a check that ensures that the 'self' argument is an instance of the class, but when this check is made, it cannot assume that the 'self' argument is actually called 'self' -- that's only a naming convention. It also doesn't know (in general) the name of the first argument to the underlying function, since the function can be an arbitrary callable -- there's no standard introspection interface for callables to find out the argument names. As you said, I see no reason to try to work harder in the case that the underlying callable supports introspection using obj.func_code.co_{argcount,varnames}. --Guido van Rossum (home page: http://www.python.org/~guido/)