[Python-Dev] Callable, non-descriptor class attributes.

Steven D'Aprano steve at pearwood.info
Sat Mar 12 06:48:51 CET 2011


Guido van Rossum wrote:

>> +1 on making staticmethods callable. I would have found that useful in the
>> past.
> 
> IIUC Thomas found that this breaks some current use of staticmethod.


As I understand it, Thomas found that having staticmethod callable AND 
have staticmethod.__get__ return self breaks code. His exact words were:

"With regards to changing staticmethod, in an earlier iteration of the 
patch I modified staticmethod to be directly callable *and* to return 
self in its tp_descr_get, and this had a side-effect I hadn't 
considered: code that used a staticmethod-wrapped object in any way 
other than calling it, broke."

I am suggesting that staticmethod should leave __get__ as is, but add a 
__call__ method equivalent to this:

def __call__(self, *args, **kwargs):
     func = self.__get__(self)
     return func(*args, **kwargs)

This won't fix the problem with inconsistent behaviour between C and 
Python callables in classes, but it will reduce the surprising fact that 
staticmethods aren't callable. Sure, it's easy enough to subclass 
staticmethod, but the fact that you need to is a gotcha.



> This is already illegal (except for classic classes in Python 2). Also
> lambda creates a standard function object so it *is* (or *has*?) a
> descriptor.

So it is. I learn something new.



-- 
Steven


More information about the Python-Dev mailing list