파이썬 애플리케이션에서 설정을 자동으로 설정하는 방법에 대해 생각 해왔습니다.git 브랜치를 기반으로 파이썬 애플리케이션을 설정하십시오.
나는 일반적으로 접근 할 경우 다음과 같은 종류의 사용 :이처럼 작동 좋아
from config import Development, Production
do_something():
if self.conf.DEBUG:
pass
def __init__(self, config='Development'):
if config == "production":
self.conf = Production
else:
self.conf = Development
: 일반적으로
'''config.py'''
class Config(object):
MAGIC_NUMBER = 44
DEBUG = True
class Development(Config):
LOG_LEVEL = 'DEBUG'
class Production(Config):
DEBUG = False
REPORT_EMAIL_TO = ["[email protected]", "[email protected]"]
를, 내가 뭔가를 할 수있는 여러 가지 방법으로 응용 프로그램을 실행하고있을 때 그것은 의미가 있기 때문에, 그러나 어떻게 든 내 자식 작업 흐름에 너무 통합 할 수 있는지 궁금 해서요.
많은 응용 프로그램에는 별도의 스크립트 또는 단독으로 실행할 수있는 모듈이 있기 때문에 일부 루트 위치에서 구성을 상속하는 모 놀리 식 응용 프로그램이 항상있는 것은 아닙니다.
이 스크립트와 별도의 모듈의 많은 같은 공유하는 config.py
에서 클래스를 찾아, 현재 체크 아웃 어떤 지점 확인하고 예를 들어, 그에 따라 자신의 기본 구성 결정을 할 수 있다면 그것은 멋진 것 name은 현재 체크 아웃 된 브랜치의 이름입니다.
그게 가능하고 그것을 달성하는 가장 깨끗한 방법은 무엇입니까?
좋은 생각인가요 나쁜 생각입니까?
import inspect, subprocess, sys
def __init__(self, config='via_git'):
if config == 'via_git':
gitsays = subprocess.check_output(['git', 'symbolic-ref', 'HEAD'])
cbranch = gitsays.rstrip('\n').replace('refs/heads/', '', 1)
# now you know which branch you're on...
tbranch = cbranch.title() # foo -> Foo, for class name conventions
classes = dict(inspect.getmembers(sys.modules[__name__], inspect.isclass)
if tbranch in classes:
print 'automatically using', tbranch
self.conf = classes[tbranch]
else:
print 'on branch', cbranch, 'so falling back to Production'
self.conf = Production
elif config == 'production':
self.conf = Production
else:
self.conf = Development
이는, 음, "약간 시험"입니다 (파이썬 2.7) :
모든 분기마다 다른 config.py를 사용하지 않는 이유는 무엇입니까? 그렇게하면 코드에서 설정을 가져 오기 만하면 VCS (이 경우에는 git)가 설정 파일의 모든 분기를 처리하도록 할 수 있습니다. – spinlok