2009-04-26 18 views
2

いくつかの実装を提供することによって、モジュールをインポートするファイルを変更せずに、プラットフォームに依存しないモジュール内で1つの関数を作成する必要があります。以下の作品:モジュールのプラットフォーム固有の実装を提供する方法は?

do_it = getattr(__import__(__name__), "do_on_" + sys.platform)

...しかし、モジュールがパッケージに入れている場合は壊れます。

代わりに、do_it()内の他のものへのハードコーディングされた呼び出しを伴うif/elifがあります。

いいですか?

答えて

2

使用globals()['do_on_' + platform]が、これはパッケージ内であるか否かが動作するはずです。

4

プラットフォームサポート用のコードをパッケージ内の別のファイルに置きます。次に、ファイルの人々はからインポートすることになっているにこれを追加します。代わりにgetattrコールし、あなたのオリジナルのアイデアの

if sys.platform.startswith("win"): 
    from ._windows_support import * 
elif sys.platform.startswith("linux"): 
    from ._unix_support import * 
else: 
    raise ImportError("my module doesn't support this system") 
+0

+1:osパッケージからデザインパターンをコピーします。 –

1

あなたはクラスのプラットフォーム固有のインスタンスを作成する必要がある場合は、工場出荷時のパターンになります。 link text

関連する問題