10

重複の可能性:
Python での動的モジュールのインポート

おそらく簡単な質問です!設定ファイルから渡されたクラスのリスト (文字列として) を反復処理する必要があります。クラスは次のようにリストされます。

TWO_FACTOR_BACKENDS = (
    'id.backends.AllowToBeDisabled', # Disable this to enforce Two Factor Authentication
    'id.backends.TOTPBackend',
    'id.backends.HOTPBackend',
    #'id.backends.YubikeyBackend',
    #'id.backends.OneTimePadBackend',
    #'id.backends.EmailBackend',
)

authenticate()ここで、これらの各クラスで関数を呼び出す必要があります (もちろん、コメント アウトされていない限り)。私は喜んでリストを繰り返し処理していますauthenticate。メソッドを呼び出すことができるように、foreach ループで文字列を Class オブジェクトに変換する方法を知る必要があるだけです。これを行う簡単な方法はありますか?

4

1 に答える 1

42

モジュールを使用して、importlibこのようなモジュールのロードを処理し、単純に使用getattr()してクラスを取得します。

たとえば、次somemodule.pyのクラスを含むモジュールがあるとしTestます。

import importlib

cls = "somemodule.Test"
module_name, class_name = cls.split(".")

somemodule = importlib.import_module(module_name)

print(getattr(somemodule, class_name))

私に与えます:

<class 'somemodule.Test'>

パッケージのようなものを追加するのは簡単です:

cls = "test.somemodule.Test"
module_name, class_name = cls.rsplit(".", 1)

somemodule = importlib.import_module(module_name)

また、既にインポートされているモジュール/パッケージはインポートされないため、モジュールのロードを追跡しなくても問題なく実行できます。

import importlib

TWO_FACTOR_BACKENDS = (
    'id.backends.AllowToBeDisabled', # Disable this to enforce Two Factor Authentication
    'id.backends.TOTPBackend',
    'id.backends.HOTPBackend',
    #'id.backends.YubikeyBackend',
    #'id.backends.OneTimePadBackend',
    #'id.backends.EmailBackend',
)

backends = [getattr(importlib.import_module(mod), cls) for (mod, cls) in (backend.rsplit(".", 1) for backend in TWO_FACTOR_BACKENDS)]

 

于 2012-05-27T11:39:32.697 に答える