我一直在考虑在Python应用程序中自动设置配置的方法。
我通常使用以下类型的方法:
'''config.py'''
class Config(object):
MAGIC_NUMBER = 44
DEBUG = True
class Development(Config):
LOG_LEVEL = 'DEBUG'
class Production(Config):
DEBUG = False
REPORT_EMAIL_TO = ["ceo@example.com", "chief_ass_kicker@example.com"]
通常,当我以不同的方式运行应用程序时,我可以执行以下操作:
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
我喜欢这样工作因为它有意义,但是我想知道我是否能以某种方式将它集成到我的git工作流程中。
我的很多应用程序都有单独的脚本或可以单独运行的模块,因此从一些根位置继承配置并不总是单一的应用程序。
如果很多这些脚本和单独的模块可以检查当前检出的分支并根据它做出默认的配置决策,例如通过在{中查找一个类,那将是很酷的{1}}与当前签出的分支的名称共享同一名称。
这是可能的,实现它的最简洁方法是什么?
这是好主意吗?
答案 0 :(得分:1)
我更喜欢spinlok的方法,但是,你可以在__init__
中做任何你想要的事情,例如:
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
这是,嗯,“经过轻微测试”(python 2.7)。请注意,如果git无法获得符号引用,check_output
将引发异常,这也取决于您的工作目录。您当然可以使用其他subprocess
函数(例如提供不同的cwd
)。