声明式的惰性环境变量配置。
buddy-config的Python项目详细描述
好友配置
从环境变量中获取设置的分离和延迟库。
动机
环境变量是配置项目最常用的方式,基于Docker, 托管在云上的e.t.c.最终它是安全和简单的方式。所以从 环境是包的唯一特性。
在获取环境的最简单方法中变得显而易见的第一个问题 变量是指试图过早获取环境变量。例如一个应用程序 由测试初始化,您需要不同的设置值 测验。但如果以这种方式获得的值:
init.py
import os
VAR_A = os.environ['VAR_A']
模块a.py
from . import *
def a():
b(VAR_A)
test.py
from . import module_a
class Test(unittest.TestCase):
@mock.patch('os', 'environ', {"VAR_A": 1})
def test_a(self, env):
...
已加载到内存中的值。因此,模仿是行不通的。最可悲的是 部分说明这个问题在大多数高级配置库中没有得到解决。所以 这是buddy config解决的第一个问题。
开始
buddy config的目标是尽可能声明性。
import buddy_config
class MyConf(metaclass=buddy_config.Config):
NAME_OF_A_SETTING_A = "NAME_OF_AN_ENVIRONMENT_VARIABLE_A", str
这是需要设置的声明的最小值。让我们把它变淡。这个 类属性的名称是设置的名称,确切地说就是您应该如何调用它。 衰减元组位置0处的字符串是一个环境变量的名称 你要从环境中恢复。以及位置1的类型类 元组的类型值是从环境中检索后的类型值。两个值都是 必修的。
要使用配置,您需要实例化它:
my_conf = MyConfig()
在实际从 配置。
print(my_config.NAME_OF_A_SETTING_A)
它也不会被缓存。
os.environ["NAME_OF_AN_ENVIRONMENT_VARIABLE_A"] = "3"
print(my_config.NAME_OF_A_SETTING_A)
默认是灵活的,每个配置实例都可以是不同的。
my_conf_a = MyConfig(NAME_OF_A_SETTING_A=1)
my_conf_b = MyConfig(NAME_OF_A_SETTING_A=2)
print(my_conf_a.NAME_OF_A_SETTING_A)
print(my_conf_b.NAME_OF_A_SETTING_A)
此外,还可以添加对检索到的值的预处理。
class MyConf(metaclass=Config):
NAME_OF_A_SETTING_C = "NAME_OF_AN_ENVIRONMENT_VARIABLE_C", int, lambda x: x ** 2
元组的可选项是预处理器。预处理器是一个可调用的 必须返回int、float、string或bytes值。
如果需要使用环境变量中的值创建组合设置,则不 问题是,好友配置可以做到这一点:
class MyConf(metaclass=Config):
NAME_OF_A_SETTING_A = "NAME_OF_AN_ENVIRONMENT_VARIABLE_A", str
NAME_OF_A_SETTING_B = "NAME_OF_AN_ENVIRONMENT_VARIABLE_B", int
COMBINED_SETTING = (
lambda self: int(self.NAME_OF_A_SETTING_A) + self.NAME_OF_A_SETTING_B
)