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

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 cassandra对象映射注释   java定制Solr TokenFilter lemmatizer   字符串从Java文件中读取windows文件名   java如何在Windows上设置StanfordCorenlp服务器以返回文本   java axis2“意外的子元素值”   java使用POI HSSF获取错误   多线程Java等待计时器线程完成   java ForkJoinPool BuffereImage处理风格   从java代码运行Python脚本   java将字节[]转换为短[],使每个短元素包含13位数据   java如何为swing jframe应用程序将代码划分为类   java使用okhttp更改baseurl   java AlertDialog。建设者setView导致堆栈溢出错误   java如何在特定的radius 安卓 studio中接收地址列表?