I’ve been thinking about ways to automatically setup configuration in my Python applications.
I usually use the following type of approach:
'''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"]
Typically, when I’m running the app in different ways I could do something like:
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
I like working like this because it makes sense, however I’m wondering if I can somehow integrate this into my git workflow too.
A lot of my applications have separate scripts, or modules that can be run alone, thus there isn’t always a monolithic application to inherit configurations from some root location.
It would be cool if a lot of these scripts and seperate modules could check what branch is currently checked out and make their default configuration decisions based upon that, e.g., by looking for a class in config.py that shares the same name as the name of the currently checked out branch.
Is that possible, and what’s the cleanest way to achieve it?
Is it a good/bad idea?
I’d prefer spinlok‘s method, but yes, you can do pretty much anything you want in your
__init__, e.g.:This is, um, “slightly tested” (python 2.7). Note that
check_outputwill raise an exception if git can’t get a symbolic ref, and this also depends on your working directory. You can of course use othersubprocessfunctions (to provide a differentcwdfor instance).