twisted の上に構築された python プロジェクトのコードをリファクタリングしようとしています。settings.py
これまでのところ、次のような定数と辞書を格納するために単純なモジュールを使用してきました。
#settings.py
MY_CONSTANT='whatever'
A_SLIGHTLY_COMPLEX_CONF= {'param_a':'a', 'param_b':b}
多くのモジュールsettings.py
は、自分の仕事をするためにインポートされます。
プロジェクトをリファクタリングする理由は、その場で構成パラメーターを変更/追加する必要があるためです。これから取ろうとしているアプローチは、すべての構成をシングルトンに集め、必要なときにいつでもそのインスタンスにアクセスすることです。
import settings.MyBloatedConfig
def first_insteresting_function():
cfg = MyBloatedConfig.get_instance()
a_much_needed_param = cfg["a_respectable_key"]
#do stuff
#several thousands of functions later
def gazillionth_function_in_module():
tired_cfg = MyBloatedConfig.get_instance()
a_frustrated_value = cfg["another_respectable_key"]
#do other stuff
このアプローチは機能しますが、非Python的で肥大化したように感じます. cfg
別の方法は、次のように、モジュール内のオブジェクトを外部化することです。
CONFIG=MyBloatedConfig.get_instance()
def a_suspiciously_slimmer_function():
suspicious_value = CONFIG["a_shady_parameter_key"]
MyBloatedConfig
残念ながら、別のモジュールでインスタンス エントリを変更している場合、これは機能しません。私はリアクター パターンを使用しているため、キューを使用するだけでなく、スレッド ローカルにスタッフを格納することも問題ありません。
完全を期すために、以下はシングルトンパターンを実装するために使用している実装です
instances = {}
def singleton(cls):
""" Use class as singleton. """
global instances
@wraps(cls)
def get_instance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance
@singleton
class MyBloatedConfig(dict):
....
異なるモジュール間で構成の変更をブロードキャストするための、より Pythonic な方法は他にありますか?