2009-08-11 14 views
26

Comment vérifier si une variable est une méthode d'instance ou non? J'utilise Python 2.5.Python: Affirmez que cette variable est une méthode d'instance?

Quelque chose comme ceci:

class Test: 
    def method(self): 
     pass 

assert is_instance_method(Test().method) 
+16

Quel est le problème avec demander ici? – quano

+3

La lecture de la source n'est pas utile - il écrit probablement du code qui doit connaître la réponse à l'exécution. Peut-être itérer à travers tout attr sur un objet, par exemple. –

Répondre

41

inspect.ismethod est ce que vous voulez savoir si vous avez vraiment une méthode, plutôt que de simplement appeler quelque chose.

import inspect 

def foo(): pass 

class Test(object): 
    def method(self): pass 

print inspect.ismethod(foo) # False 
print inspect.ismethod(Test) # False 
print inspect.ismethod(Test.method) # True 
print inspect.ismethod(Test().method) # True 

print callable(foo) # True 
print callable(Test) # True 
print callable(Test.method) # True 
print callable(Test().method) # True 

callable est vrai si l'argument si l'argument est un procédé, une fonction (y compris lambda s), une instance de __call__ ou une classe.

Les méthodes ont des propriétés différentes de celles des fonctions (par exemple im_class et im_self). Donc, vous voulez

assert inspect.ismethod(Test().method) 
+5

+1, inspecter est bon (et cette typo "provocante" se lit bien ;-). –

+5

http://www.d-e-f-i-n-i-t-e-l-y.com/ :-) –

+0

En utilisant Python 3.5, 'inspect.ismethod (Test.method)' renvoie False. – Devin

8

Si vous voulez savoir si c'est précisément une méthode d'instance utiliser la fonction suivante. (Il considère les méthodes qui sont définies sur une métaclasse et accessibles sur une des méthodes de classe de classe, bien qu'ils puissent également être considérés comme des méthodes d'instance)

import types 
def is_instance_method(obj): 
    """Checks if an object is a bound method on an instance.""" 
    if not isinstance(obj, types.MethodType): 
     return False # Not a method 
    if obj.im_self is None: 
     return False # Method is not bound 
    if issubclass(obj.im_class, type) or obj.im_class is types.ClassType: 
     return False # Method is a classmethod 
    return True 

vérification Habituellement, pour c'est une mauvaise idée. Il est plus flexible de pouvoir utiliser n'importe quel callable() de manière interchangeable avec les méthodes.