0

クラスのすべての関数を含むが、アルファベット順に並べ替えられていないリストを作成するにはどうすればよいですか? 実際に私はそれを持っているので:

[ foo.__dict__.get(a) for a in dir(foo) if isinstance(foo.__dict__.get(a), types.FunctionType) ]

そして、それは私にリストを返しますが、並べ替えました...私はデコレータでも試しました:

def decorator ():
    listing = []
    def wrapped (func):
        listing.append(func)
        return func
    wrapped.listing = listing
    return wrapped

それは問題ありませんが、クラスの各関数にデコレータを追加する必要があります...いくつかのトリックがありますか?

4

1 に答える 1

6

inspectモジュールのドキュメントを参照してください。関数オブジェクトに は属性がfunc_codeあり、(ドキュメントによると-まだテストしていません)属性func_codeが必要co_firstlinenoです。これは、ソースファイルのコードの最初の行の番号になります。

したがって、次のようなものを試してください:

def getListOfClassFunctions(foo):
    '''foo - a class object'''
    funcList = [ foo.__dict__.get(a) for a in dir(foo) if isinstance(foo.__dict__.get(a), types.FunctionType)]
    funcList = filter(lambda x: x.func_code.co_filename == foo.__module__, funcList)  # Thanks Martijn Pieters for a hint!
    return sorted(key=lambda x: x.func_code.co_firstlineno, funcList)

スニペット全体を関数でラップし、クラスと同じモジュールで定義された関数のみを返すように編集しました。

于 2012-09-05T11:01:15.333 に答える