0

以下のPythonファイル構造があるとします。

\function_group
     |-__init__.py
     |-sub_function1
     |----|__init__.py
     |----|sub_sub_func1.py
     |----|sub_sub_func2.py
     |----|sub_sub_func3.py 
     |-sub_function2
     |----|__init__.py
     |----|sub_sub_func1.py
     |----|sub_sub_func2.py
     |----|sub_sub_func3.py 

それぞれに、関数がそれ自体でsub_sub_funcX.pyすべての関数名を収集するリストがあります。sub_sub_funcX.py

# sub_sub_funcX.py  
# and each sub_sub_funcX.py file has similiar code

import inspect 
functions = inspect.getmembers(self?, inspect.isfunction)   # how to write the "self" here

def bar(x, y):
    return x * y

def bar1(x, y):
    return x + y

私の質問は

  1. マークされた上記のコードで"# how"、ポイントセルフの正しい表現は何ですか?それは"sub_sub_funcX"

  2. トップモジュールをインポートするときに、これらすべての[関数]の完全なリストを取得するにはどうすればよいですfunction_groupか?つまり、各sub_functionモジュールは、インポート時に何らかの方法でその関数リストの一番上にレポートできるのでしょうか。

  3. __init__フックと取り外しが簡単なだけでハウスキーピングコードを追加せずにモジュールを簡単に拡張できる方法はありますか?たとえば、後で次のように構造を変更します。

\function_group
     |-__init__.py
     |-sub_function1
     |----|__init__.py
     |----|sub_sub_func1.py
     |----|sub_sub_func2.py
     |----|sub_sub_func3.py 
     |-sub_function2
     |----|__init__.py
     |----|sub_sub_func1.py
     |----|sub_sub_func2.py
     |----|sub_sub_func3.py 
     |----|sub_sub_func4.py            # new added
     |-sub_function3                   # new added    
     |----|__init__.py                 # new added
     |----|sub_sub_func1.py            # new added

     |----|sub_sub_sub_function_31     # new sub added    
     |--------|__init__.py             # new added
     |--------|sub_sub_sub_sub_func1.py# new added
4

1 に答える 1

1

1:必要

import inspect
import sys
inspect.getmembers(sys.modules[__name__], inspect.isfunction)

2:私が考えることができる最善の答えは、サブモジュールをインポートし、それらをトップレベルで検査することです。

  1. いいえ、責任はトップレベルパッケージ(インポートされたもの)にあり、必要なことを実行します。トップパッケージにインポートされない限り、トップパッケージをインポートして、サブパッケージがその機能を実行することを期待することはできません。また、トップレベルのinit .pyを変更したくないので、それは起こりません。

これらの関数で何をしようとしているのか正確に教えてください。これだけの内省よりも良い方法が必要と感じています。

于 2010-11-01T07:06:16.643 に答える