从各种源加载配置的库

nectarine的Python项目详细描述


油桃

从各种源加载配置的库。在

要求

油桃需要Python3.7或更高版本,并已使用Python3.7和3.8进行了测试。在

安装

油桃可以通过pip安装。在

$ pip3 install nectarine        # Install the basic version
$ pip3 install nectarine[yaml]  # Install the YAML extension

供应商

油桃从称为providers的不同后端加载配置。下表列出了可用的 供应商。在

NameDescription
argumentsA provider that reads from the program arguments
envA provider that reads from the program environment variables
dictionaryA provider that reads from a user-provided dictionary
jsonA provider that reads from a user-provided JSON file
yamlA provider that reads from a user-provided YAML file

循序渐进的例子

Nectarine使您能够使用Python的数据类描述配置,并从各种 源(程序参数、配置文件等)。在

让我们考虑一个使用RabbitMQ代理的事件的程序(例如,使用awesomepika库!)。 当然,这个小程序应该允许用户配置连接参数,比如代理的主机和 侦听端口、要使用的凭据等

我们的程序将接受来自3个不同提供商的配置:

  • 程序参数
  • 程序环境
  • 一个JSON配置文件,比如./conf.json,其中包含主机/端口/用户名/密码的字段

这里的想法是允许用户使用环境或参数快速覆盖配置文件。在

为了表示这些连接参数,我们创建了以下数据类:

^{pr2}$

下一步是与用户通信,获取配置,并创建RabbitMQ的实例 用它。让我们看看如何用油桃来达到这个目的。在

油桃提供了一个load函数,它需要两件事:要加载的类型和要从中加载的提供者列表。在

我们已经有了目标类型(即RabbitMQ),因此我们需要选择我们的提供者:

  • 对于程序参数,arguments提供程序
  • 对于程序环境,env提供程序
  • 对于JSON文件,json提供程序

现在,我们可以像下面这样调用load函数并检索其结果:

fromnectarineimportload,arguments,env,jsonrabbitmq=load(target=RabbitMQ,providers=[arguments(),env(prefix="RABBITMQ_"),json("./conf.json")])print(rabbitmq)

差不多了!运行程序时,rabbitmq变量现在随配置一起加载:

$ echo '{"host": "localhost", "port": 5671, "username": "user", "password": "pass"}' > ./conf.json
$ ./consumer.py
RabbitMQ(host='localhost', username='user', password='pass', port=5671)
$ ./consumer.py --port 1234
RabbitMQ(host='localhost', username='user', password='pass', port=1234)

特点

  • [x] 多个配置提供程序:程序参数、环境、配置文件。。。在
  • [x] 值重写:高优先级提供程序重写来自低优先级提供程序的值
  • [x] 复杂结构:支持嵌套的数据类和集合
  • [x] 类型检查:根据数据类中提供的类型提示检查配置数据
  • [x] 数据类特性:可以像在常规数据类中一样指定默认值或工厂

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

推荐PyPI第三方库


热门话题
算法图形。路径方向Java枚举方向问题无法使用EAST   Java:将字符串转换为特定语言环境   javaspringboot&Thymeleaf为后续调用保存搜索表单的最佳方法   mapreduce程序中未调用java reducer   java如何将url中的Gif文件保存到手机中?   如何在JavaSwing中使用[Esc]键最小化JInternalFrame?   java创建了一个包含100个按钮、80个空按钮和20个随机按钮的网格布局   如何在java中使用数组对2d字符串数组中的每一行进行排序。分类   java无法识别的SSL消息,纯文本连接?例外   为什么Java编译器允许在抛出部分列出方法无法抛出的异常   java将预测数组添加到训练数组   java从Ajax调用获取响应文本   使用改型2的java应用程序等待一分钟后退出