Я думал о способах автоматической настройки конфигурации в моих приложениях 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 = ["[email protected]", "[email protected]"]
Как правило, когда я запускаю приложение по-разному, я мог бы сделать что-то вроде:
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
который имеет то же имя, что и имя текущей проверенной ветки.
Возможно ли это, и какой самый чистый способ достичь этого?
Это хорошая/плохая идея?
Я бы предпочел метод 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 не может получить символический ref, и это также зависит от вашего рабочего каталога. Разумеется, вы можете использовать другие функции subprocess
(например, для создания другого cwd
).