2012-01-23 7 views
1

モジュールが持つ可能性のある特定のプロパティに基づいて、実行時に特定のフォルダからモジュールを列挙してロードすることで、私が書いているPythonフレームワークを改善したいと考えています。Pythonでどのように拡張ローダーを作成しますか?

おそらく、一部のメタデータフィールドに特定の値(タグなど)を含むモジュール、またはおそらく特定の基本クラスから派生したクラスを含むモジュールのみのプロパティです。

たとえば、拡張機能がさまざまな種類の認証をサポートするプラグインであるとしましょう。私はフレームワークが明示的な設定を必要とせずに実行時に可能なプラグインを発見するようにします。

このような「拡張読み込み」が可能でなければならないと思われますし、試行錯誤していると思われる検索クエリは何も表示されていません。他の誰かのアプローチを読むことでこれを実装する、良いプロジェクトです。

このようなことを構築するためのアプローチについての指針(あるいは、この問題についてもっとPython的な考え方についてのアドバイス)は素晴らしいものです。

答えて

2

(このため良い答えは概要とオプションを与えるだろう、そう私の迅速な答えを受け入れるように急いではありません。)

私はすべてのモジュール内のクラスをロードするために私のプロジェクトの一つでこれを行いますimport *とハードコーディング名を使用しないパッケージ。コードはGoogle Codeのコンテキストで表示できます。

SPECIES = [] 
'''An automatically generated list of the available species types.''' 

def _do_import(): 
    '''Automatically populates SPECIES with all the modules in this 
    folder. 

    :Note: 
     Written as a function to prevent local variables from being 
     imported. 
    ''' 
    import os 

    for _, _, files in os.walk(__path__[0]): 
     for filename in (file for file in files if file[0] != '_' and file[-3:] == '.py'): 
      modname = filename[:filename.find('.')] 
      mod = __import__(modname, globals(), fromlist=[]) 
      for cls in (getattr(mod, s) for s in dir(mod)): 
       if cls is not Species and type(cls) is type and issubclass(cls, Species): 
        if getattr(cls, '_include_automatically', True): 
         SPECIES.append(cls) 
         globals()[cls.__name__] = cls 

_do_import() 
+0

これは間違いなく私を開始させるのに十分です。ほとんど私が理解する必要があったのは '__import __()'の存在だったので、これを出発点にして取得する必要がある場所に移動することができます。 – sblom

関連する問題