简单配置管理应用
config-source的Python项目详细描述
此包提供了从各种源加载的可扩展配置。
功能:
- 类似dict的配置加载自:
- python词典
- python对象
- python文件
- 环境变量
- json文件
- 自定义配置源和对象。
基本上,config-source提供了注册配置加载程序和 直呼他们的名字。加载程序接受可选参数,读取配置 从特定源并填充配置对象。
示例:
from config_source import DictConfig from config_source import DictConfigLoader config = DictConfig() config.load_from('pyfile', '/path/to/config.py') config.load_from('json', '/path/to/config.json') config.load_from('env', prefix='MYCFG_') loader = DictConfigLoader(config) loader.load('/path/to/config.py') loader.load('/path/to/config.json') loader.load(SomeClassWithConfigs)
用法
开箱即用:
- 低级load_to()函数。
- DictConfig类。
- DictConfigLoader类来帮助加载配置。
load_to()调用为特定源注册的加载程序并填充 传递给它的配置对象:
load_to(config, 'source_name', ...)
- config-要填充的配置对象。
- source_name-配置源名称。
DictConfig的行为类似于普通的python字典,并提供 load_from方法从不同的源加载配置(它使用 load_to()内部):
config = DictConfig() config.load_from(<source_name>, *args, **kwargs)
- <source_name>-配置源名称;
- *args和**kwargs-配置加载器的参数。
以下是dict-like的现成资源 配置。
note:dict like表示任何具有映射接口的对象都可以用作 配置对象:
config = {} load_to(config, 'env', ...) dictconfig = DictConfig() dictconfig.load_from('env', ...) load_to(dictconfig, 'env', ...)
object-从python加载配置object。它读取属性 大写名称:
config.load_from('object', <object>)
示例:
class MyConfig: SECRET_KEY = 123 DEBUG = False ... config.load_from('object', MyConfig)
dict-从python字典加载配置。只读大写 按键:
config.load_from('dict', <dict>)
示例:
myconfig = dict(SECRET_KEY=123, DEBUG=False) config.load_from('dict', myconfig)
env-从当前运行时环境加载配置:
config.load_from('env', prefix=<name_prefix>, trim_prefix=True)
- prefix-环境变量名称前缀。
- trim_prefix-包含或不包含结果配置名称的前缀
示例:
# Load vars with names MYCFG_*, like MYCFG_SECRET. config.load_from('env', prefix='MYCFG_')
pyfile-从python文件加载配置。只读大写 属性:
config.load_from('env', filename, silent=False)
- filename-要加载的文件名。
- silent-不要对丢失的文件引发错误。
示例:
config.load_from('pyfile', 'config.py')
json-从json文件加载配置。只读大写键:
config.load_from('json', filename, silent=False)
- filename-要加载的文件名。
- silent-不要对丢失的文件引发错误。
示例:
config.load_from('json', '/path/to/config.json')
DictConfigLoaderauto从输入配置源检测源名称:
loader = DictConfigLoader(config) loader.load('/path/to/file.py') # Same as: config.load_from('pyfile', '/path/to/file.py')
您可以子类化以扩展自动检测。
添加源
config_sourcedecorator用于注册附加配置 来源:
from config_source import config_source @config_source('source_name') def myloader(config, arg1, arg2): config['XX'] = arg1 + arg2 config.load_from('source_name', 1, arg2=2)
配置加载器必须是可调用的,至少有一个参数- 要填充的配置对象。其他参数是可选的和特定于加载程序的。
有可能通过实现 带入口点的包裹:
setup( ... entry_points={'config_source.sources': '<source> = <package name>'}, ... )
在包中使用config_sourcedecorator。
有关入口点的详细信息,请参见
- https://packaging.python.org/guides/creating-and-discovering-plugins/
- http://setuptools.readthedocs.io/en/latest/pkg_resources.html#entry-points
- http://setuptools.readthedocs.io/en/latest/setuptools.html#dynamic-discovery-of-services-and-plugins
note:即使包添加了 多种来源。
默认值
而不是总是将参数传递给您可以设置的配置加载程序 默认值在DictConfig:
config = DictConfig(defaults={ 'env': {'prefix': 'MYAPP_'}, 'pyfile': {'filename': '/path/to/file.py'} }) # 'prefix' will be set to MYAPP_ for 'env' config source. # Load from 'MYAPP_*' vars by default. config.load_from('env') # Load from 'MY_*' vars config.load_from('env', 'MY_') # Load from '/path/to/file.py' by default. config.load_from('pyfile') # Load from '/path/to/another/file.py'. config.load_from('pyfile', '/path/to/another/file.py')
defaults是一个映射,其中键是源名称,值是关键字 要传递给加载程序的参数。
自定义配置类型
您可以为特定类型注册配置源 (默认为adict):
@config_source('source_name', config_type='mytype') def mytype_loader(config): ....
config_type这里是定义配置对象类型的字符串。
现在填充配置对象使用加载程序:
load_to(config, 'source_name', config_type='mytype')
其中config是实现mytype接口的对象。
list配置示例:
from config_source import config_source, load_to @config_source('object', config_type='list') def object_loader(config, obj): has = False for key in dir(obj): if key.isupper(): has = True config.append(getattr(obj, key)) return has class MyConfig: SECRET = 1 DEBUG = False cfg = [] load_to(cfg, 'object', config_type='list') # cfg = [1, False] # Fails because by default it calls loader for 'dict' configuration. # load_to(cfg, 'object')