跳转到主要内容

从环境变量映射Python配置

项目描述

https://travis-ci.org/jmcs/ecological.svg?branch=master Codacy Badge https://api.codacy.com/project/badge/Coverage/1ff45d0e1a5a40b8ad0569e3edb0539d

生态

生态 结合了 PEP526 和环境变量,使得配置 12因子应用程序 变得简单。

入门

生态 会根据配置类定义自动获取和转换环境变量。

例如,假设你的应用程序有一个可配置的(整数)端口和一个(布尔)调试标志,以及一个(字符串)日志级别,默认为INFO,你可以简单地声明你的配置为

class Configuration(ecological.Config):
    port: int
    debug: bool
    log_level: str = "INFO"

然后设置环境变量 PORTDEBUGLOG_LEVEL生态 将自动将具有相同(但大写)名称的环境变量设置为类的属性。

默认情况下,值设置为类定义的类型,并分配给类本身(即类不需要实例化)。如果需要,可以更改此行为(请参阅自动加载部分)。

教程

本教程教程可以帮助您交互式地了解库的基本功能。

类型支持

Ecological还支持一些在PEP484中定义的类型,例如

class Configuration(ecological.Config):
    list_of_values: List[str]

将自动解析环境变量值作为列表。

带前缀的配置

您还可以选择为您的应用程序配置添加前缀,例如,以避免冲突

class Configuration(ecological.Config, prefix='myapp'):
    home: str

在这种情况下,home属性将从MYAPP_HOME环境属性中获取。

嵌套配置

Ecological.Config还支持嵌套配置,例如

class Configuration(ecological.Config):
    integer: int

    class Nested(ecological.Config, prefix='nested'):
        boolean: bool

这样,您可以将相关的配置属性分层分组。

高级

细粒度控制

您可以控制配置属性设置的一些行为。

这可以通过提供作为属性默认值的ecological.Variable实例或通过在类级别指定全局选项来实现

my_source = {"KEY1": "VALUE1"}

class Configuration(ecological.Config, transform=lambda v, wt: v, wanted_type=int, ...):
    my_var1: WantedType = ecological.Variable(transform=lambda v, wt: wt(v), source=my_source, ...)
    my_var2: str
    # ...

所有可能的选项及其含义可以在下表找到

选项

类级别

变量级别

默认值

描述

prefix

None

当从属性名称派生变量名称时,该前缀被转换为大写并添加到前面。

variable_name

从属性名称派生,并在指定前缀(如果指定)的情况下被添加;转换为大写。

当在变量级别指定时,它表示将要使用的确切源变量名称。

当在类级别指定时,它被视为一个函数,该函数从属性名称返回变量名称,其签名如下

def func(attribute_name: str, prefix: Optional[str] = None)

default

(无默认值)

如果未设置,则属性默认值。

transform

将源值转换为期望的类型。在非标量类型(+标量bool)的情况下,首先使用Python解析值。

一个将值从source转换为预期值和wanted_type的函数,其签名如下

def func(source_value: str, wanted_type: Union[Type, str])

source

os.environ

将从中加载值的字典。

wanted_type

str

属性的期望Python类型。

在变量级别,通过属性的类型注解指定:my_var_1: my_wanted_type

然而,它也可以在类级别指定,在这种情况下,它作为当未提供注解时的默认值

class MyConfig(ecological.Config, wanted_type=int, ...)

以下规则适用于选项解析

  • 当在变量和类级别都指定了选项时,变量级别的选项优先于类级别的选项,

  • 当在变量级别缺少某些选项时,它们的默认值从类级别获取,

  • 无需分配一个ecological.Variable实例即可更改行为;它仍然可以在类级别(全局)进行更改。

自动加载

通过在类定义中指定autoload选项,可以延迟/禁用变量值的自动加载(设置)。

在类创建时(默认)

当未提供选项时,值在类创建时立即加载并分配给类属性

class Configuration(ecological.Config):
    port: int
# Values already read and set at this point.
# assert Configuration.port == <value-of-PORT-env-var>
永不

选择此选项时,不会发生自动加载。为了设置变量值,需要显式调用Config.load方法。

class Configuration(ecological.Config, autoload=ecological.Autoload.NEVER):
    port: int
# Values not set at this point.
# Accessing Configuration.port would throw AttributeError.

Configuration.load()
# Values read and set at this point.
# assert Configuration.port == <value-of-PORT-env-var>
在对象实例初始化时

如果更倾向于在对象实例上加载和存储属性值,而不是在类本身上,可以使用Autoload.OBJECT策略。

class Configuration(ecological.Config, autoload=ecological.Autoload.OBJECT):
    port: int
# Values not set at this point.

config = Configuration()
# Values read and set at this point on ``config``.
# assert config.port == <value-of-PORT-env-var>
# Accessing ``Configuration.port`` would throw AttributeError.

注意事项和已知限制

  • Ecological不支持(公共)在Config类中的方法。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

ecological-2.0.0.tar.gz (11.2 kB 查看哈希值)

上传时间

构建分布

ecological-2.0.0-py3-none-any.whl (9.2 kB 查看哈希值)

上传时间 Python 3

由以下组织支持