Python: affirmer que la variable est la méthode d'instance?
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)
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 lambda
s), 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.