Question

Comment peut-on vérifier si une variable est une méthode d'instance ou non? J'utilise Python 2.5.

Quelque chose comme ça:

class Test:
    def method(self):
        pass

assert is_instance_method(Test().method)
Était-ce utile?

La solution

inspect.ismethod est ce que vous voulez savoir si vous avez définitivement une méthode, plutôt que quelque chose que vous pouvez appeler.

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 une méthode, une fonction (y compris lambdas), une instance avec __call__ ou une classe.

Les méthodes ont des propriétés différentes de celles des fonctions (comme im_class et im_self). Alors vous voulez

assert inspect.ismethod(Test().method)  

Autres conseils

Si vous voulez savoir s'il s'agit précisément d'une méthode d'instance, utilisez la fonction suivante. (Il considère les méthodes définies sur un métaclasse et accessibles sur une méthode de classe de classe, bien qu'elles puissent également être considérées 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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top