Project Icon

ConfZ

Python配置管理库ConfZ提供多源加载和验证功能

ConfZ是一个Python配置管理库,基于Pydantic构建。它支持从配置文件、环境变量和命令行参数等多种源加载配置,并提供数据转换、验证和类似数据类的访问方式。ConfZ适用于多环境配置、单例模式和单元测试等场景,也支持自定义配置源。最新的ConfZ 2版本兼容Pydantic 2,并优化了命名规范。

ConfZ – 基于Pydantic的配置管理

测试 文档 覆盖率 Python版本 PyPI版本

ConfZ是一个基于pydantic的Python配置管理库。 它可以让你轻松地:

  • 从配置文件、环境变量、命令行参数等加载配置
  • 将加载的数据转换为所需格式并验证
  • 以Python数据类似对象的方式访问结果,并获得完整的IDE支持

它还支持常见的用例,如:

  • 多环境
  • 单例模式和延迟加载
  • 单元测试的配置更改
  • 自定义配置源

更新:ConfZ 2已经发布,支持pydantic 2并改进了命名约定。 查看迁移指南

:package: 安装

ConfZ已发布在PyPI上,可以使用pip安装:

pip install confz

:rocket: 快速入门

使用ConfZ的第一步是声明你的配置类和源,例如在config.py中:

from confz import BaseConfig, FileSource
from pydantic import SecretStr, AnyUrl

class DBConfig(BaseConfig):
    user: str
    password: SecretStr

class APIConfig(BaseConfig):
    host: AnyUrl
    port: int
    db: DBConfig

    CONFIG_SOURCES = FileSource(file='/path/to/config.yml')

得益于pydantic,你可以使用多种字段类型验证器

从现在开始,在任何其他文件中,你都可以直接访问你的配置:

from config import APIConfig

print(f"API服务运行在 {APIConfig().host},端口 {APIConfig().port}。")

如你所见,配置既不需要显式加载,也不需要全局实例化。ConfZ会在你第一次访问配置时,按照CONFIG_SOURCES中定义的方式自动加载。由于采用了单例机制,这只会发生一次,之后你会得到一个缓存的、不可变的实例,行为与其他_pydantic_实例相同。

assert APIConfig() is APIConfig()   # 由于单例机制,这是正确的
APIConfig().port = 1234             # 由于不可变性,这会引发错误
APIConfig().model_dump()            # 调用pydantic的方法获取字典表示

注意: 虽然配置的隐式和隐藏加载可能起初会让人感到惊讶,感觉有点像Python的魔法,但它可以帮你减少大量样板代码。你不需要显式加载配置,然后将其传递给所有需要它的代码层,而是可以通过导入配置类并直接访问例如APIConfig().db.user来从任何地方访问它。

更多配置源

ConfZ在定义配置源方面非常灵活。你有多个环境吗?没问题:

from confz import BaseConfig, FileSource

class MyConfig(BaseConfig):
    ...
    CONFIG_SOURCES = FileSource(
        folder='/path/to/config/folder',
        file_from_env='ENVIRONMENT'
    )

现在你的配置文件可以在环境变量ENVIRONMENT中定义,并相对于folder

你还可以提供一个列表作为配置源,例如从环境变量(包括.env文件)和命令行参数中读取:

from confz import BaseConfig, EnvSource, CLArgSource

class MyConfig(BaseConfig):
    ...
    CONFIG_SOURCES = [
        EnvSource(allow_all=True, file=".env.local"),
        CLArgSource(prefix='conf_')
    ]

ConfZ现在会尝试从与属性同名的环境变量或以conf_开头的命令行参数中填充你的配置。递归模型也受支持,例如,如果你想控制上面API中的用户名,你可以设置环境变量DB.USER或传递命令行参数--conf_db.user

显式加载

在某些情况下,配置不应该是全局单例,而应该显式加载并在本地传递。 可以在构造函数中直接定义源,而不是将CONFIG_SOURCES定义为类变量:

from confz import BaseConfig, FileSource, EnvSource

class MyConfig(BaseConfig):
    number: int
    text: str

config1 = MyConfig(config_sources=FileSource(file='/path/to/config.yml'))
config2 = MyConfig(config_sources=EnvSource(prefix='CONF_', allow=['text']), number=1)
config3 = MyConfig(number=1, text='hello world')

如你所见,还可以提供额外的关键字参数。

注意: 如果既没有提供类变量CONFIG_SOURCES,也没有提供构造函数参数config_sourcesBaseConfig的行为就像一个普通的_pydantic_类。

更改配置值

在某些情况下,你可能想要更改配置值,例如在单元测试中。但是,如果你设置了CONFIG_SOURCES类变量,这就不能直接进行。为了解决这个问题,每个配置类都提供了一个上下文管理器,可以临时更改你的配置:

from confz import BaseConfig, FileSource, DataSource

class MyConfig(BaseConfig):
    number: int
    CONFIG_SOURCES = FileSource(file="/path/to/config.yml")

print(MyConfig().number)                            # 将打印配置文件中的值

new_source = DataSource(data={'number': 42})
with MyConfig.change_config_sources(new_source):
    print(MyConfig().number)                        # 将打印'42'

print(MyConfig().number)                            # 将再次打印配置文件中的值

早期验证

默认情况下,你的配置会在你第一次实例化类时加载,例如通过MyConfig().attribute。这可以防止在导入配置类时产生副作用,如加载文件。如果配置类无法以正确格式填充所有必需字段,_pydantic_会在这一点上引发错误。为了确保这不会在不方便的时候发生,你也可以指示ConfZ提前加载所有配置:

from confz import validate_all_configs

if __name__ == '__main__':
    validate_all_configs()
    # 你的应用程序代码

函数validate_all_configs会实例化在你代码中任何(可达)位置定义的、设置了CONFIG_SOURCES的所有配置类。

:book: 文档

现在你已经看到了ConfZ可以使用的两种方式:使用类变量配置源,实现单例和延迟加载,或使用关键字参数配置源,允许直接加载配置值。在这两种情况下,从文件、命令行参数和环境变量定义配置源都非常灵活(而且可扩展),同时_pydantic_仍然确保一切最终符合你的期望。你还看到了如何在单元测试中临时更改配置,以及如何在代码早期验证单例配置类。

ConfZ完整功能的文档可以在readthedocs上找到。

:information_source: 关于

ConfZZühlke开发和维护。 第一个版本由Silvan实现。 特别感谢Iwan的ConfMe,它启发了这个项目。

想为ConfZ做贡献?查看贡献指南

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号