Callable or not callable, that is the question!
Peter Otten
__peter__ at web.de
Thu Jul 11 10:11:47 EDT 2013
Ulrich Eckhardt wrote:
> Hello!
>
> I just stumbled over a case where Python (2.7 and 3.3 on MS Windows)
> fail to detect that an object is a function, using the callable()
> builtin function. Investigating, I found out that the object was indeed
> not callable, but in a way that was very unexpected to me:
>
> class X:
> @staticmethod
> def example():
> pass
> test1 = example
> test2 = [example,]
>
> X.example() # OK
> X.test1() # OK
> X.test2[0]() # TypeError: 'staticmethod' object is not callable
Slightly modified example:
>>> @staticmethod
... def example(): return 42
...
>>> class X:
... example = example
...
>>> X.example()
42
>>> example()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'staticmethod' object is not callable
When you access an attribute its __get__() method is implicitly called. This
is part of the descriptor protocol:
>>> X.example
<function example at 0x7fe45c0ea3b0>
>>> example
<staticmethod object at 0x7fe45aafc090>
>>> example.__get__(X)
<function example at 0x7fe45c0ea3b0>
While it would be easy to make staticmethod callable
>>> class Staticmethod(staticmethod):
... def __call__(self, *args, **kw):
... return self.__func__(*args, **kw)
...
>>> @Staticmethod
... def foo(): return "bar"
...
>>> foo()
'bar'
>>> X.baz = foo
>>> X.baz()
'bar'
I see no clear advantage over the current situation.
> Bug or feature?
No bug. Missing feature if you come up with a convincing use-case.
More information about the Python-list
mailing list