2

統一された(同じ)インターフェースを持つ2つの異なるモジュールがあるとします。ファイルのリストは次のようになります。

root/
   logic.py
   sns_api/
      __init__.py
      facebook/
          pyfacebook.py
          __init__.py
      myspace/
          pymyspace.py
          __init__.py

また、pyfacebook.py と pymyspace.py には同じインターフェイスがあります。つまり、次のことを意味します。

# in pyfacebook.py
class Facebook:
   def __init__(self, a, b):
       # do the init
   def method1(self, a, b, ...):
       # do the logic

# in pymyspace.py
class Myspace:
   def __init__(self, a, b):
       # do the init
   def method1(self, a, b, ...):
       # do the logic

質問があります。コードを複製せずに logic.py でロジックを実行したいので、どのモジュールを使用しているかを示すフラグを設定するだけで、Python が適切なコードを自動的にロードする方法を知りたいと思っています。つまり、次のことを意味します。

# in logic.py

PLATFORM = "facebook"

# import the right modules in, complete the logic with the current platform
# create the right instance and invoke the right methods

次に、PLATFORM = 'myspace' を変更すると、ロジックが自動的に機能します。

では、どうすればこれを行うことができますか?

動的インポートを使用するか、生の python コードを評価するかは疑問ですが、良い解決策ではないようです。または、均一なラッパーを作成できれば

sns_api/__init__.py

誰でも助けることができますか?

4

3 に答える 3

6

たった2つで私はやります

if platform == 'facebook':
    from pyfacebook import FaceBook as Platform
elif platform == 'myspace':
    from pymyspace import Myspace as Platform
else:
    raise RuntimeError, "not a valid platform"

Platform残りのコードで使用します。ライブラリではこのように行われosます。モジュールを参照してください。

を使用して本当に動的なインポートを行うことができますが、おそらくこれは必要ありません。name =__import__('module')

于 2009-10-22T12:58:11.147 に答える
0

exec も使用できます。

exec "from sns_api.%s import Platform" % PLATFORM

次に、実装ファイルで、プラットフォームに何かを割り当てます。

# in pyfacebook.py
class Facebook:
   def __init__(self, a, b):
       # do the init
   def method1(self, a, b, ...):
       # do the logic

Platform = Facebook
于 2009-10-22T17:51:10.727 に答える
0

各モジュールに「ファクトリー」機能を持ち、動的インポートを行い、ロードされたモジュールのファクトリーを呼び出します。少なくとも、それはそれを行う 1 つの方法です。Pythonic の方法は「ダック タイピング」であるため、ファクトリはオブジェクトを返し、クライアントは「ダック コール」を通じてそれを使用します:-)

于 2009-10-22T12:48:49.990 に答える