2016-04-21 28 views
0

2つのバージョンのストレージがあります。バージョンに基づいて、私は結果を得るために適切なインタフェースモジュールを選択する必要があります。Python 2.7:指定された変数に基づいて、インポートされたモジュールの動的モジュールのインポート

ファイル構造は次のようになりますストレージのバージョンに応じてstorageサブパッケージに記載されているインターフェースのいずれかをインポートする必要があり

lib/ 
    __init__.py 
    provider.py 
    connection.py 
    device.py 

    storage/ 
     __init__.py 
     interface_v1.py # interface for storage of version 1 
     interface_v2.py # interface for storage of version 2 

main.py 
main.py

輸入provider.py、。

main.py:

from lib.provider import Provider 
from lib.connection import Connection 
from lib.device import Device 

connection = Connection.establish(Device) 
storage_version = Device.get_storage_version() 

massage = Provider.get_data(connection) 

provider.pyはstorage_versionに基づいて、ストレージへのインタフェースをインポートし、いくつかの機能を提供実装する必要があり:

from storage import interface 

class Provider(object): 

    def __init_(self): 
     self.storage = interface.Storage 

    def get_data(self, connection): 
     return self.storage.get_data() 

    def clear_storage(self, connection): 
     self.storage.clear_storage() 

この例は完全ではないが、あるべきです問題の説明に十分です。

追加質問:

  • はそれだけで サブパッケージのインポートを使用するようにstorage.__init__を使用することは可能ですか?
  • PythonでFactoryを適切に実装する方法は? interface_v1interface_v2 bithを想定すると、
+1

実際に問題を解決するために何をしましたか、それについては何が問題になっていませんか? – kindall

+0

@kindall:実際問題は、storage_versionのためにインターフェイスをインポートする方法がわかりません。 storage_versionは、プロバイダモジュールのインポート後に定義されるため、通常の動的インポートはここでは機能しません。 –

+0

Provider1とProvider2のクラスを持つことについて、factoryを使用して、プロバイダのインスタンスを取得するにはどうしたら* storage_versionを知っていますか?私には必要なダイナミクスは必要ありません。 –

答えて

0

は、私がこのような何かを推測クラスStorageClassをimpleement:

import storage.interface_v1 
import storage.interface_v2 

class Provider(object): 

    def __init__(self , version): 
     if version == 1: 
      self.storage = storage.interface_v1.StorageClass 
     else: 
      self.storage = storage.interface_v2.StorageClass 

が最善の解決策になるが - しかし、https://docs.python.org/2/library/functions.html#importは名前に基づいてモジュールをインポートする方法を提供する必要があります。

+0

も同意する。複雑で動的な読み込みが不要で、必要に応じて両方のストレージバージョンを同時に提供できます。 –

関連する問題