Pythonは定数をサポートしていない。
それもで定数ファイルっぽいものを作って、ついでに動的に初期化してやろうと思った。
一通り書いた後でクラスにまとめた方が良かったと後悔しているが供養しておく。
ファイル構成
- test1.py:定数の定義と、動的に定数を初期化する関数(定数なのか?)を備えた管理ファイル。
- test2.py:test1.pyの定数で自分を初期化するファイル。ビジネスロジック用。
- test3.py:test1.pyの初期化とtest2.pyを使う、エントリポイントのファイル。
それぞれ中身は次のような感じにしてみた。
定数管理ファイル
CONST_A = 100
def init(mode = False):
global CONST_A # グローバル宣言
if mode:
CONST_A = 200 # グローバル変数を更新
else:
CONST_A = 300 # グローバル変数を更新
def output_const():
print("CONST_A:" + str(CONST_A))
ビジネスロジック用
import test1
CONST_B = test1.CONST_A
def output_const():
print("CONST_B:" + str(CONST_B))
エントリポイント
import importlib
import test1
import test2
def main():
# test & sample code
# test1のCONST_Aを初期化する
test1.init(mode=True)
test1.output_const() # 200が出力される
test2.output_const() # 100が出力される test2のCONST_Bはimportされたタイミングの「CONST_A = 100」のまま
print("reload test2 module.")
importlib.reload(test2) # test2をリロードすると、更新されたtest1のCONST_Aで初期化される
test1.output_const() # 200が出力される
test2.output_const() # 200が出力される
if __name__ == "__main__":
main()
test1.initだけで全部更新できないのがすごく気持ち悪い。この構造だとimportlib.reloadして定数が更新されたあとにもう一度読み込む必要がある。
importの場所を気遣うか、定数ファイルの初期化をしたあとに関連モジュールを初期化するのか、定数ファイルなんてものは忘れてクラスにまとめ上げるべきなのか、、たぶんクラスにしとくのが良いと思う。でもクラスにまとめるとNumbaとかで高速化するときにめんどくさいしなぁ。