在整个 Python 应用程序中全局管理配置
项目描述
gconf
在整个 Python 应用程序中全局管理配置
概述
使用 gconf,可以在模块范围内加载 yaml 配置文件,以便可以从正在运行的应用程序中的任何位置访问其值。
用法
加载 yaml 文件
一个或多个 yaml 配置文件从类似路径的对象全局加载,通常在程序的 main 函数中。生成的配置是所有已加载配置的叠加,稍后加载的配置优先。
加载单个配置文件:
gconf.load('conf.yml')
一次加载多个配置文件:
gconf.load('conf1.yml', 'conf2.yml')
一个接一个地加载多个配置文件:
gconf.load('conf1.yml')
gconf.load('conf2.yml')
上面的两个示例产生了相同的结果。在这两种情况下config2
都优先于config1
并覆盖其值。
每次调用load
都会返回实际已加载的所有路径的列表。
从路径列表中加载第一个配置:
gconf.load_first('conf1.yml', 'conf2.yml')
如果conf1.yml
存在,它会被加载并被conf2.yml
忽略。如果conf1.yml
不存在,conf2.yml
则加载。
load_first
返回实际加载的路径。
FileNotFoundError
如果没有找到文件,所有加载函数都会引发 a 。这可以通过设置关键字参数来防止required=False
。
手动添加值
可以从应用程序内将 dict 添加到配置中。这相当于加载具有相同内容的配置文件,如果它们已经存在则覆盖值,如果不存在则添加它们。
gconf.add({'parent': {'child': 'new child'}})
警告:使用此功能,可以将 gconf 模块作为全局变量的存储。全局变量是一种代码味道,不应该使用!请gconf.add()
仅在您确切知道自己在做什么的情况下使用该功能。
访问配置值
有几种方法可以寻址存储在配置中的值,所有这些方法都使用模块级get
方法。
点符号
gconf.get('parent.child.some value')
字符串参数
gconf.get('parent', 'child', 'some value')
两者的混合
gconf.get('parent.child', 'some value')
顶级项目作为字典
gconf.get()['parent']['child']['some value']
一些中间项目作为字典
gconf.get('parent')['child']['some value']
要访问列表项,只需在路径中使用它们的索引
gconf.get('list.3')
默认值
该get
方法接受一个default
参数,如果指定的项目不存在,则返回该参数:
gconf.get('non-existing', default=default_value)
这甚至适用于虚假值,如False
,None
或空字符串。
环境变量覆盖
配置值被环境变量覆盖。由于环境变量的键按照惯例是带有下划线的大写字母,因此 gconf 期望它们以这种方式出现。转换规则如下:
GCONF_
添加前缀以避免冲突- 层次结构级别由下划线分隔
- 空格替换为下划线
- 所有文本全部大写
例子:
gconf.get | 环境变量 |
---|---|
parent.some child | GCONF_PARENT_SOME_CHILD |
list.0.entry | GCONF_LIST_0_ENTRY |
错误
如果尝试加载不存在的文件并且required=True
(默认),FileNotFoundError
则会引发 an。
如果没有default
提供,则尝试访问不存在的项目会引发KeyError
.
临时覆盖
部分配置可以通过上下文管理器临时覆盖。传递给它一个覆盖现有字典的字典:
with gconf.override_conf({'parent': {'child': 'override_value'}}):
gconf.get('parent.child') # => 'override_value'
gconf.get('parent.child') # => 'original_value'
要临时删除部分配置,DELETED
可以使用常量:
import gconf
with gconf.override_conf({'parent': {'child': gconf.DELETED}}):
gconf.get('parent.child') # => KeyError
gconf.get('parent.child') # => 'original_value'
重置
全局 gconf 字典可以完全重置。
gconf.reset()