A python library for loading, validating and reading configuration from many heterogeneous formats. Configuration is split into two phases.
Configuration is read from files or python objects, flattened, and merged into a container called a namespace. Namespaces are used to separate unrelated configuration groups.
If configuration is changed frequently, it can also be reloaded easily with very little change to the existing code.
A configuration value is looked up in the namespace. It is validating and converted to the requested type.
- PyStaticConfiguration is available on pypi: https://pypi.python.org/pypi/PyStaticConfiguration
- The source is hosted on github: https://github.com/dnephin/PyStaticConfiguration
$ pip install PyStaticConfiguration
Also see the release notes.
http://pythonhosted.org/PyStaticConfiguration/
A common minimal use of staticconf would be to use a single yaml configuration file and read some values from it.
import staticconf
filename = 'hosts.yaml'
namespace = 'hosts'
# Load configuration from the file into namespace `hosts`
staticconf.YamlConfiguration(filename, namespace=namespace)
...
# Some time later on, read values from that namespace
print staticconf.read('database.slave', namespace=namespace)
print staticconf.read('database.master', namespace=namespace)
hosts.yaml might look something like this:
database:
slave: dbslave_1
master: dbmaster_1
A more involved example would load configuration from multiple files, create a watcher for reloading, and read some config values.
from functools import partial
import os
import staticconf
def load_config(config_path, defaults='~/.myapp.yaml`)
# First load global defaults if the file exists
staticconf.INIConfiguration('/etc/myapp.ini', optional=True)
# Next load user defaults
staticconf.YamlConfiguration(defaults, optional=True)
# Next load the specified configuration file
staticconf.YamlConfiguration(config_path)
# Now let's override it with some environment settings
staticconf.DictConfiguration(
(k[6:].lower(), v) for k, v in os.environ.items() if k.startswith('MYAPP_'))
def build_watcher(filename):
return staticconf.ConfigFacade.load(
filenames, 'DEFAULT', partial(load_config, filename))
def run(config_path):
watcher = build_watcher(config_path)
while is_work():
watcher.reload_if_changed()
current_threshold = staticconf.read_float('current_threshold')
do_some_work(current_thresold)