> 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/)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4