23

私のアプリケーションでは、というパッケージ内のモジュールを使用していexampleますexamplemod

私のアプリ:

from example import examplemod
examplemod.do_stuff()

その中に別のモジュールをインポートしますexample

例mod.py:

from example import config
# uses config
# then does stuff

config定数を使用します。

config.py:

CONSTANT = "Unfortunate value"

examplemodアプリケーションで使用しているときにこの定数をオーバーライドして ( に設定CONSTANT = "Better value")、基礎となるモジュールを変更したくないので、独自のパッケージを維持する必要がありません。これどうやってするの?

4

4 に答える 4

24

はい。ただし、モジュールへの完全修飾アクセスパスでのみ期待どおりに機能します。

import example
example.examplemod.config.CONSTANT = "Better value"
example.examplemod.do_stuff()
于 2012-09-19T13:52:58.450 に答える
13

回答ありがとうございます。書かれたとおりに機能するものはありませんでしたが、彼らは私を正しい方向に向けました。私は最終的に次のことをしました:

import example.config
example.config.CONSTANT = "Better value"

from example import examplemod
examplemod.do_stuff()
# desired result!

(また、CONSTANT を構成可能なオプションにするパッチをモジュールメンテナに提出しているので、これを行う必要はありませんが、その間にストックモジュールをインストールする必要があります。)

于 2012-09-19T14:27:30.300 に答える
2

これはモンキーパッチと呼ばれ、同じことを達成する別の方法がある場合は好まれませんが、かなり一般的です。

examplemod.config.CONSTANT = "Better value"

問題は、内部構造に依存しておりexamplemodconfig同じままであるため、いずれかのモジュールが変更されると壊れる可能性があることです。

于 2012-09-19T13:52:16.090 に答える
1

これで十分かどうかはわかりませんが、試しましたか:

from example import config
config.CONSTANT = "A desirable value"

examplemodがインポートされる前に、必ずこれを行ってください。Pythonはインポートをキャッシュするため、config変更したものは取得したものと同じになるため、これは機能するはずexamplemodです。

于 2012-09-19T13:49:49.163 に答える