LayeredConfig compiles configuration from files, environment variables, command line arguments, hard-coded default values, or other backends, and makes it available to your code in a simple way:
from layeredconfig import (LayeredConfig, Defaults, INIFile,
Environment, Commandline)
# This represents four different way of specifying the value of the
# configuration option "hello":
# 1. hard-coded defaults
defaults = {"hello": "is it me you're looking for?"}
# 2. INI configuration file
with open("myapp.ini", "w") as fp:
fp.write("""
[__root__]
hello = kitty
""")
# 3. enironment variables
import os
os.environ['MYAPP_HELLO'] = 'goodbye'
# 4.command-line arguments
import sys
sys.argv = ['./myapp.py', '--hello=world']
# Create a config object that gets settings from these four
# sources.
config = LayeredConfig(Defaults(defaults),
INIFile("myapp.ini"),
Environment(prefix="MYAPP_"),
Commandline())
# Prints "Hello world!", i.e the value provided by command-line
# arguments. Latter sources take precedence over earlier sources.
print("Hello %s!" % config.hello)
- A flexible system makes it possible to specify the sources of configuration information, including which source takes precedence. Implementations of many common sources are included and there is a API for writing new ones.
- Included configuration sources for INI files, YAML files, JSON file, PList files, etcd stores (read-write), Python source files, hard-coded defaults, command line options, environment variables (read-only).
- Configuration can include subsections (ie.
config.downloading.refresh
) and if a subsection does not contain a requested setting, it can optionally be fetched from the main configuration (ifconfig.module.retry
is missing,config.retry
can be used instead). - Configuration settings can be changed by your code (i.e. to update a "lastmodified" setting or similar), and changes can be persisted (saved) to the backend of your choice.
- Configuration settings are typed (ie. if a setting should contain a date, it's made available to your code as a
datetime.date
object, not astr
). If settings are fetched from backends that do not themselves provide typed data (ie. environment variables, which by themselves are strings only), a system for type coercion makes it possible to specify how data should be converted.