트위스트 된 위에 파이썬 프로젝트의 코드를 리펙토링하려고합니다.파이썬에서 구성 변경 사항을 동적으로 브로드 캐스트합니다.
#settings.py
MY_CONSTANT='whatever'
A_SLIGHTLY_COMPLEX_CONF= {'param_a':'a', 'param_b':b}
모듈의 큰 거래는 자신의 물건을 할 settings.py
을 가져옵니다 지금까지 내가 좋아하는 상수와 사전을 저장하는 간단한 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
이 접근법은 효과가 있지만 부 자연스러운 느낌이납니다. 대안은 다음과 같이 모듈에 cfg
객체를 구체화하는 것입니다 : 내가 다른 모듈에 MyBloatedConfig
인스턴스 항목을 변경하고있는 경우
CONFIG=MyBloatedConfig.get_instance()
def a_suspiciously_slimmer_function():
suspicious_value = CONFIG["a_shady_parameter_key"]
불행하게도이 작동하지 않습니다. 원자로 패턴을 사용하기 때문에
스레드 로컬에 직원을 저장하는 것은 문제가되며 대기열을 사용하는 것입니다. 구현 내가 싱글 톤 패턴
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):
....
다른 모듈에서 구성 변경 내용을 방송하는 다른 많은 파이썬 방법이 있나요을 구현하기 위해 사용하고있다 다음과 완전성에 대해
?
저는 싱글 톤 안티 패턴에 대해 잘 알고 있습니다 만, 제 경우에는 MyBlocatedConfig 글로벌 오브젝트 (간략히 설명하자면)는 제 어플리케이션의 핵심을 구현합니다. 'reactor' 객체와 비교할 수 있습니다. 'reactor'는 singleton twisted가 속박되어있다. 명시 적으로 함수 시그니처에 전달하지 말고 모듈을 가져 와서 (명시 적으로 모듈을 다시로드하지 않도록) 사용하십시오. 전 세계적인 물건을 가져오고 사용하지 않기 위해 제안을 환영하지만, 신청서에 무언가로 무언가를 가지고 서명을 오염시키지 않아도됩니다. – autholykos
'원자로'가 하나의 실수라고 널리 여겨지고 있습니다. 이 실수를 수정하기위한 장기 계획이 있습니다. :) 그러나 전역 객체가 애플리케이션의 핵심이라고 말하면 나는 당신을 믿어야 만합니다. 그리고 나는 그 경우에 제안 할 것이 많지 않습니다, 그렇게 행운. –
매우 흥미 롭습니다. 어쩌면 만약 당신이 저에게 장기 계획에 대한 몇 가지 문서를 가르키면 제 코드를 리팩토링하는 데 영감을 줄 수 있습니다. (아마도 기여할 수도 있습니다 :) – autholykos