プログラム全体でハードコードされた値を最小化するために、次のような定数のセットを定義しましたConstants.py
。
FOO = 42
HOSTNAME=socket.gethostname()
BAR = 777
これらの定数を使用したいすべてのモジュールは、単に実行してすぐimport Constants
に使用します。Constants.FOO
現在、これらの定数の一部は、プログラムが実行されている実際のホストに依存する場合があります。したがって、アプリケーションが実行されている実際の環境に基づいて、それらのいくつかを選択的にオーバーライドしたいと思います。最初の大まかな試みは次のようになりましたConstants.py
。
FOO = 42
HOSTNAME=socket.gethostname()
if HOSTNAME == 'pudel':
BAR = 999
elif HOSTNAME == 'knork'
BAR = 888
else:
BAR = 777
これは問題なく動作しますが、ファイルが特殊なケースで乱雑になるので、避けたいと思います。
シェルスクリプトを実行している場合は、次のようなものを使用しますConstants.sh
。
FOO = 42
HOSTNAME=$(hostname)
BAR = 777
# load host-specific constants
if [ -e Constants_${HOSTNAME}.sh ]; then
. Constants_${HOSTNAME}.sh
fi
およびオプションConstants_pudel.sh
で、次のようになります。
BAR = 999
これにより、共通の定数が一緒に保持され、別々のファイルでそれらを簡単にオーバーライドできます。
私はシェルスクリプトではなくPythonプログラムを書いているので、同じ結果を得る方法を考えていました。
無駄に私は次のようなことを試みました:
FOO = 42
HOSTNAME=socket.gethostname()
BAR = 777
try:
__import__('Constants_'+HOSTNAME)
except ImportError:
pass
次のようにConstants_poodle.py
なります。
import Constants
Constants.BAR = 999
これは、内で問題なく動作しますが、別のpythonファイルでConstants_poodle
試してみると、元のファイルが取得されます。import Constants
Constants.BAR
まったく機能しないことは別として、使用__import__()
は非常に醜いように思われるので、特定のセットアップに対してエクスポートされた定数をオーバーライドする適切な方法があると思いますか?