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_outputgit がシンボリック参照を取得できない場合、例外が発生することに注意してください。これは、作業ディレクトリにも依存します。もちろん、他の関数を使用することもできます (たとえばsubprocess、別の関数を提供するため)。cwd

于 2012-05-02T00:51:52.877 に答える