2016-09-22 1 views
0

いくつかの関数にいくつかのシムロジックを挿入するための別のモジュールをラップするモジュールがあります。ラップされたモジュールは、私が公開したい設定モジュールmod.settingsを使用しますが、今後も同様のものをシムに入れたい場合に備えて、ユーザーがそこからインポートしないようにします。私は彼らにwrapmod.settingsを輸入してほしい。第三者モジュールのパススルー/エクスポート(__all__を使用していますか?)

モジュールをインポートしてエクスポートすると機能しますが、クライアント側で少し冗長です。ただthingの代わりにsettings.thingと書く必要があります。

from wrapmod.settings import *のユーザーがfrom mod.settings import *と同じ結果を得たいと考えていますが、現在はfrom wrapmod import settingsのみ利用可能です。これを回避するにはどうすればいいですか?

答えて

1

私が状況を正しく理解していれば、既存のパッケージmodの部品を変換するためのモジュールwrapmodを書いています。変換している部分はサブモジュールmod.settingsです。 settingsモジュールをインポートして変更しましたが、wrapmod.settingsとして利用可能であっても、from ... import ...ステートメントでそのモジュール名を使用することはできません。

私はそれを修正する最善の方法は、変更されたモジュールを新しいドット付きの名前でsys.modulesに挿入することだと思います。これは、wrapmodが実際にパッケージではないにもかかわらず、Pythonがその名前を有効として受け入れるようにします。ハッキングsys.module以来

import sys 

from mod import settings 

# modify settings here 

sys.modules['wrapmod.settings'] = settings # add this line! 
0

私が代わりに薄いラッパーモジュールのコード・ジェネレータを作ってしまったが、すべてのIDEとの統合を破った:

のでwrapmodは、次のようになります。

from ... import mod 

# this is just a pass-through wrapper around mod.settings 
__all__ = mod.__all__ 

# generate pass-through wrapper around mod.settings; doesn't break IDE integration, unlike manual sys.modules editing. 
if __name__ == "__main__": 
    for thing in settings.__all__: 
     print(thing + " = mod." + thing) 

スクリプトとして実行すると、このファイルの末尾に追加できるコードが出力されます。

関連する問題