python应用程序的配置管理器。

magic-settings的Python项目详细描述


魔术设置

安装

pip install magic-settings

使用yaml的设置文件

pip install magic-settings[yaml]

初始化

项目设置类声明

frommagic_settingsimportBaseSettings,PropertyfromfunctoolsimportpartialclassMySettings(BaseSettings):VERSION=Property(types=str)PROJECT_DIR=Property(types=str)LOGGING_LEVEL=Property(default='INFO',choices=['NOTSET','DEBUG','INFO','WARNING','ERROR','CRITICAL'])RETRIES_NUMBER=Property(types=int,converts=[int])COEFFICIENT=Property(types=float,converts=[float])DEBUG=Property(types=bool,converts=[int,bool],default=False)DISTRIBUTED_SERVICE_HOST_NAMES=Property(types=list,converts=[partial(str.split,sep=',')])

属性是具有以下参数的描述符:

  • 类型-值的类型或可能的类型的元组。如果value不是类型之一,则为valueerror
  • 验证器-可调用对象的列表,每个对象依次应用于。如果value未通过至少一个验证(如果任何验证函数返回false),则引发valueerror
  • 选项-任何对象的列表。如果不在选项中-将引发值错误。使用此参数时,参数类型验证器将被忽略。
  • 默认值-设置属性的默认值
  • 转换可调用对象的列表。它是一个连续应用于并每次覆盖它的转换链。仅当value是字符串时,它才适用于value。如果至少有一个转换未能应用,则引发valueerror

属性类

除了属性之外,以下类还可以用于标准类型:

  • boolproperty:接受布尔值,将不区分大小写的truefalse转换为适当的python布尔值。此属性还接受数字(0为false,1为true)。
  • floatproperty:接受浮点数值。
  • intproperty:接受整数值。
  • stringproperty:接受字符串值。
  • stringlistproperty:接受字符串列表。可以在此类的构造函数中指定分隔符(是默认值)。
  • hostListProperty:接受主机列表。每个主机都是一个元组,包含一个string主机名和一个int端口。对应该用逗号分隔,主机名和端口应该用冒号分隔。例如,192.168.20.1:80、www.yandex.ru:1234、localhost:8888将转换为[('192.168.20.1',80)、('www.yandex.ru',1234)、('localhost',8888)]

使用以下属性可以简化以上示例:

frommagic_settingsimport(BaseSettings,Property,BoolProperty,FloatProperty,IntProperty,StringListProperty,StringProperty)classMySettings(BaseSettings):VERSION=StringProperty()PROJECT_DIR=StringProperty()LOGGING_LEVEL=Property(default='INFO',choices=['NOTSET','DEBUG','INFO','WARNING','ERROR','CRITICAL'])RETRIES_NUMBER=IntProperty()COEFFICIENT=FloatProperty()DEBUG=BoolProperty(default=False)DISTRIBUTED_SERVICE_HOST_NAMES=StringListProperty()

设置配置

设置配置发生在创建设置对象的阶段。

frommy_projectimportmy_module,my_awesome_modulefrommy_configimportMySettingssettings=MySettings(modules=[my_module,my_awesome_module],prefix='MY_PROJECT_ENV_SETTINGS',dotenv_path='/path/to/my/env',override_env=True,yaml_settings_path='/path/to/my/yaml/settings.yaml',use_env=True)

参数

  • 模块:要导入变量的python模块列表。默认值

  • 前缀:获取环境变量的前缀。默认值-

    设置.py

    classMySettings(BaseSettings):PSYDUCK=Property(types=str)

    .env

    MYPROJECT_PSYDUCK=Owowowow
    

    一些其他地方。py

    settings=MySettings(prefix='MYPROJECT')

    settings=MySettings(prefix='MYPROJECT_')
  • dotenv_path:指向env文件的路径。默认值-。用于将变量从env文件导出到环境。如果dotenv_pathnone-在目录树上查找指定的文件-默认情况下称为.env

  • 覆盖环境true-使用.env-文件中的变量覆盖现有系统环境变量,false-不覆盖。默认值-false

  • yaml\u设置路径:指向yaml配置文件的路径。默认值-

  • 使用环境true-使用环境变量。默认值-true

例外情况

值错误:如果模块类型不是列表非类型,如果模块中的元素类型不是模块类型

设置加载

加载设置可以在项目中的任何位置启动。

啊!

如果再次调用,它将遍历配置文件并更新属性。

设置优先级

如果设置交叉,将应用以下优先级: 我的模块>;我的超棒模块>;.env>;设置.yaml

啊!

我的module.py

是啊。

我的真棒模块.py

啊!13!

.env

AAAAAAA H14

设置.yaml

是啊。

示例

啊! 啊! AAAAAAA 18 啊! AAAAAAA H20 AAAAAAAAA 21

临时属性覆盖

我的module.py

啊! AAAAAAAAA 23

方法属性的临时集合不是线程安全的。

设置列表

您可以使用方法to u dict()to u json()获取当前设置:

啊!

验证

建议在重新定义期间使用以下basesettings类方法update settings from source方法:

  1. 预验证-检查类型配置是否正确;检查选项中的值和默认值是否通过类型检查。
  2. post u validate-检查是否为每个属性指定了值。

动态设置

实现自定义动态设置源

在dictsource中存储设置的示例 AAAAAH25

项目动态设置类的定义

啊!

动态设置初始化

是啊。
  • 更新/周期:从源更新设置之间的时间(秒)。
  • task u retries u number:停止任务前发生异常时更新设置的尝试次数。

动态设置更新

只更新一次设置

AAAAAAAAA 28

启动更新循环 AAAAAAA 29

停止更新循环 AAAAAAA 30

将设置写入源

啊!

例外情况

  • magic settings.dynamicsettingsourceerror-如果继承自basedynamicsettings的类中的设置源不可用,则应选择此异常。

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

推荐PyPI第三方库


热门话题
java Android:将秒转换为年、日、时、分、秒   java无法在onEnable()中使用成员变量   正则表达式Java PatternSyntaxException:字符串替换的非法重复?   java不可访问错误   java单击复选框未使用Selenium webdriver工作,即使复选框已显示   eclipse(java)不会加载工作区   Java中的软件自动更新程序   javajavax。邮政MessaginException:无法连接到SMTP主机:SMTP。gmail。com,端口:465错误   java按逗号模式匹配拆分   java在脱机模式下使用Liquibase为空数据库生成变更日志   给定java类名和一对jar文件,在每个jar文件中查找父类名   java如何在另一个活动中检索SharedReference文件的值?   java在预定时间启动、停止和重复服务   java如何手动合并所有/res值。xml?   java如何创建文本文件,然后在其中放入字符串?   java如何获取错误消息?   java在JAXR中QueryParam和MatrixParam之间有什么区别?   升级到Spring Boot 2.3.0后,java Mongo和Spark分区失败