3

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 :メソッドの場合、対応するクラスも取得したい。クラス/インスタンス メソッドの処理方法は知っていますが (上記のコードを参照)、静的メソッドのクラスを取得するにはどうすればよいですか?

4

2 に答える 2

2

isfunction()のメソッドを使用するより良い方法だと思いますinspect

構文:

[inspect.getmembers(<module name>, inspect.isfunction)] # will give all the functions in that module

単一のメソッドをテストしたい場合は、次の方法で実行できます...

inspect.isfunction(<function name>) # return true if is a function else false

関数と共に使用できる多くの述語があります。inspect明確な図については、Python 3 のドキュメントを参照してください。

于 2013-11-13T07:03:40.097 に答える