声明式的惰性环境变量配置。

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
    )

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何使用JNA创建同一库的多个实例?   java在将Graphql查询作为JSON字符串传递时收到意外的令牌错误   OAuth2 oltu的java问题   java桌面应用程序使用的好的嵌入式数据库是什么?   java Firebase数据库高级查询选项   java正在使磁盘上的EhCache元素过期   java 安卓还原处于backstack中的片段的实例状态   XMemcached中的java异步集   java TimescaleDB是否使用与Postgresql完全相同的JDBC驱动程序?   java从网站c读取信息#   检查java Android中的字符串是否只包含数字和空格   c#如何向web服务发送特殊字符?   grails无法调用需要java的方法。lang.类参数?   java我在组合框中调用的方法不会运行所有代码,它只运行部分代码   java发送带有标头的HTTP GET请求