[Python-Dev] Keyword for first argument of methods?

Guido van Rossum guido@python.org
Fri, 27 Sep 2002 11:32:57 -0400


> 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/)