Python 3でメソッドと関数を区別したい。さらに、メソッドなら対応するクラスを取得したい。私の現在の解決策は次のようなものです:
import types
import inspect
def function_or_method(f):
if inspect.ismethod(f):
if inspect.isclass(f.__self__):
print("class method")
klass = f.__self__
else:
print("instance method")
klass = f.__self__.__class__
elif inspect.isfunction(f): # function
if f.__name__ != f.__qualname__: # to distiguish staticmethod and function
print("static method")
# HOW TO GET THE CLASS
else:
print("function")
else:
print("not function or method")
class Foo():
def bari(self):
pass
@classmethod
def barc(cls):
pass
@staticmethod
def bars():
pass
def barf():
pass
function_or_method(Foo().bari) # instance method
function_or_method(Foo.barc) # class method
function_or_method(Foo.bars) # static method
function_or_method(barf) # function
動作しますが、エレガントではありません。そして、何かを逃したかどうかはわかりません。誰もがより良い解決策を知っていますか?
UPDATE 1 :メソッドの場合、対応するクラスも取得したい。クラス/インスタンス メソッドの処理方法は知っていますが (上記のコードを参照)、静的メソッドのクラスを取得するにはどうすればよいですか?