J'essaye d'implémenter la fonction infer_class
qui, étant donné une méthode, détermine la classe à laquelle appartient la méthode.Comment déduire la classe à laquelle appartient @staticmethod?
Jusqu'à présent, je quelque chose comme ceci:
import inspect
def infer_class(f):
if inspect.ismethod(f):
return f.im_self if f.im_class == type else f.im_class
# elif ... what about staticmethod-s?
else:
raise TypeError("Can't infer the class of %r" % f)
Il ne fonctionne pas pour @ staticmethod-s parce que je ne pouvais pas trouver un moyen d'y parvenir.
Des suggestions?
Voici infer_class
en action:
>>> class Wolf(object):
... @classmethod
... def huff(cls, a, b, c):
... pass
... def snarl(self):
... pass
... @staticmethod
... def puff(k,l, m):
... pass
...
>>> print infer_class(Wolf.huff)
<class '__main__.Wolf'>
>>> print infer_class(Wolf().huff)
<class '__main__.Wolf'>
>>> print infer_class(Wolf.snarl)
<class '__main__.Wolf'>
>>> print infer_class(Wolf().snarl)
<class '__main__.Wolf'>
>>> print infer_class(Wolf.puff)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in infer_class
TypeError: Can't infer the class of <function puff at ...>
Vous avez la source, vous pouvez lire la classe parente. Pourquoi avez-vous besoin de cela? Qu'est-ce que vous essayez d'accomplir? –
Supposons que je souhaite écrire une fonction qui stocke temporairement une fonction ou une méthode (pour intercepter des appels ou autre, à des fins de test). Pour pouvoir faire cela, j'ai besoin de deux ingrédients: l'objet qui contient la fonction, et le nom de la fonction, de sorte que je puisse faire 'setattr (obj, func_name, my_stub)'. Si f est une fonction au niveau du module, j'utilise 'inspect.getmodule (f)' pour obtenir l'objet et 'f .__ name__' pour obtenir son nom. Pour les méthodes de classe et les méthodes d'instance, j'utilise le code ci-dessus. Pour les méthodes statiques, je n'ai pas de chance, semble-t-il. –