Python3: verifica si el método es estático

Pregunta similar (relacionada con Python2: Python: verifique si el método es estático )

Veamos la siguiente definición de clase:

class A: def f(self): return 'this is f' @staticmethod def g(): return 'this is g' 

En Python 3 ya no existe ningún método, todo es función, por lo que la respuesta relacionada con Python 2 ya no funcionará.

Como dije, todo es función, por lo que podemos llamar a Af(0) , pero por supuesto no podemos llamar a Af() (argumento missmatch). Pero si hacemos una instancia a=A() y llamamos af() Python pasa a la función Af the self como primer argumento. Llamar a ag() impide enviarlo o captura el self , por lo que debe haber una forma de probar si se trata de un método estático o no.

Entonces, ¿podemos verificar en Python3 si un método fue declarado como static o no?

 class A: def f(self): return 'this is f' @staticmethod def g(): return 'this is g' print(type(A.__dict__['g'])) print(type(Ag))   

Necesitaba esta solución y escribí lo siguiente basado en la respuesta de @root

 def is_method_static(cls, method_name): # http://stackoverflow.com/questions/14187973/python3-check-if-method-is-static for c in cls.mro(): if method_name in c.__dict__: return isinstance(c.__dict__[method_name], staticmethod) raise RuntimeError("Unable to find %s in %s" % (method_name, cls.__name__)) 

Para Python 3.2 o más reciente, use inspect.getattr_static() para recuperar el atributo sin invocar el protocolo descriptor:

Recupere los atributos sin activar la búsqueda dinámica a través del protocolo descriptor, __getattr__() o __getattribute__() .

Use isinstance(..., staticmethod) en el resultado:

 >>> from inspect import getattr_static >>> isinstance(getattr_static(A, 'g'), staticmethod) True 

La función puede manejar instancias y clases, y analizará la jerarquía de clases completa por usted:

 >>> class B(A): pass ... >>> isinstance(getattr_static(B, 'g'), staticmethod) # inherited True >>> isinstance(getattr_static(B(), 'g'), staticmethod) # instance, inherited True