1

我一直在考虑如何在我的 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 工作流程中。

我的许多应用程序都有单独的脚本或可以单独运行的模块,因此并不总是有一个单一的应用程序可以从某个根位置继承配置。

如果许多这些脚本和单独的模块可以检查当前签出的分支并基于此做出默认配置决策,例如,通过查找config.py与当前名称共享相同名称的类,那将是很酷的签出分支。

这可能吗,实现它的最干净的方法是什么?

这是一个好/坏主意吗?

4

1 回答 1

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)。请注意,check_output如果 git 无法获得符号引用,则会引发异常,这也取决于您的工作目录。您当然可以使用其他subprocess功能(例如提供不同cwd的功能)。

于 2012-05-02T00:51:52.877 回答