変数がインスタンスメソッドであるかどうかをどのように確認できますか?私はpython 2.5を使用しています。
このようなもの:
class Test:
def method(self):
pass
assert is_instance_method(Test().method)
inspect.ismethod
は、呼び出すことができるものだけでなく、確実にメソッドがあるかどうかを確認したいものです。
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
sを含む)、__call__
を持つインスタンス、またはクラスの場合、引数がlambda
の場合はtrueです。
メソッドには、関数とは異なるプロパティがあります(im_class
やim_self
など)。あなたが望んでいるのは
assert inspect.ismethod(Test().method)
それが正確にインスタンスメソッドであるかどうかを知りたい場合は、次の関数を使用してください。 (メタクラスで定義され、クラスクラスメソッドでアクセスされるメソッドを考慮しますが、インスタンスメソッドと見なすこともできます)
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
通常、それをチェックすることは悪い考えです。任意のcallable()をメソッドと交換可能に使用できる方が柔軟性があります。