2016-04-03 5 views
1

スタートアップ時にいくつかのモジュールがロードされています。すべてのモジュールには名前と送信機能があります。インポートされたモジュールにアクセスするには、それらをdictに格納し、dictキーでアクセスします。クラスをdictにclass.nameをキーとして保存する

m1 = Module1() 
m2 = Module2() 
modules = {m1.name: m1, m2.name: m2} 
# now access a function 
modules["m1_name"].send() 

このアプローチはかなりうまく動作しますが、私には少し醜いようです。 「公式」な方法はありますか?

EDIT: 私は優先順位のリストを定義し、prios = ["signal", "telegram", "txt"]を言って、プログラムは常に最優先でモジュールを使用しようとすると、グループの各ユーザーにメッセージを送信しようとします。 prioリストのモジュールのみがインポートされます。

EDIT: 私のインポート機能は、次のようになります。

for modul_name in prios: 
    modul_import = importlib.import_module(("modules." + modul_name)) 
    modul = modul_import.Modul(self.inbox) 
    modul.start() 
    modules[modul_name] = modul 
+2

なぜモジュールそのものの代わりに、ハードコードされ、 'name'の経由を使用してモジュールにアクセスしませんか?どのように他のモジュールが各モジュールのハードコードされた名前を知っているのですか?それはカプセル化を破るように見え、コード/デザインの匂いのようです。 – yangmillstheory

答えて

0

あなたはあなたの例では、それをインポートし、同じモジュールからm1m2にアクセスしていますか?もしそうなら、それはnameによってそれにアクセスすることは不必要に間接的なようです。このpatternを参照してください -

そうでない場合は、インポートモジュールのスコープでm1、およびm2を持つことは、あなただけのより直接的で、Python的にはどのオブジェクト自体のモジュールを使用してアクセスすることができ、その場合には、そのモジュールをインポートし、他のモジュールにそれがアクセスできるようになります。

あなたが明示的にこれらの輸出を宣言し、 m1の残りの部分を非表示にする場合があります

m2

__all__ = ['m1_send', 'm2_send'] 

m1_send = m1.send 
m2_send = m2.send 

のような最後に、あなたはあなたの name__name__を複製していないことを確認していますか? docs here__name__を検索してください。

0

モジュール辞書の使い方の例を教えてください。間接的にモジュール名を与えるsend関数を呼び出す必要がありますか?

とにかくあなたのアプローチが私のためにきれいですが、多分あなたはAttrDictを使用することを好むだろうが、ここで説明:Accessing dict keys like an attribute in Python?

class AttrDict(dict): 
    def __init__(self, *args, **kwargs): 
     super(AttrDict, self).__init__(*args, **kwargs) 
     self.__dict__ = self 


modules = AttrDict(m1.__name__=m1, m2.__name__=m2) 

modules.m1.send() 
modules.m2.send() 
+0

コードスニペットが間違っていて、キーワード引数のスペーシングに関して[PEP 8(https://www.python.org/dev/peps/pep-0008/#other-recommendations)に違反しています。 'm1 .__name__'が' m1_name'と同じであるという保証もありません。 – yangmillstheory

+0

ありがとう、良い点。一定。 – apr

関連する問題