管理应用程序设置的Hipster Orgazmic工具
pydantic-settings的Python项目详细描述
Pydantic设置
Hipster-orgazmic tool to mange application settings
在应用程序设置范围内扩展pydantic功能的库pydantic已经有设置
实现,例如pydantic.BaseSettings
,但从我的观点来看,它缺少一些有用的功能:
- 即使对于嵌套字段,也可以通过环境变量覆盖设置值
- 提供有关加载的文件或环境变量中的值位置的详细信息,这有助于指出用户错误
- 为模型字段编写文档感觉不太舒服,但为应用程序设置编写全面的文档是非常必要的
NOTE: Alpha quality
安装
使用pip:
pip install pydantic-settings
用法示例
通过env变量覆盖值
允许重写嵌套字段的值(如果它们表示为pydantic模型)。
下面是示例:
frompydanticimportBaseModel,ValidationErrorfrompydantic_settingsimportBaseSettingsModelclassNested(BaseModel):foo:intclassSettings(BaseSettingsModel):nested:Nestedtry:Settings.from_env({'APP_nested_FOO':'NOT AN INT'})exceptValidationErrorase:asserte.raw_errors[0].env_loc=='APP_nested_FOO'# shows exact env variable name
文件中的点精确错误位置
frompydanticimportBaseModel,IntegerErrorfrompydantic_settingsimportBaseSettingsModel,LoadingValidationError,load_settings,FileLocationclassNested(BaseModel):foo:intclassSettings(BaseSettingsModel):nested:Nestedconf_text="""nested: foo: 'NOT AN INT'"""try:load_settings(Settings,conf_text,type_hint='yaml')exceptLoadingValidationErrorase:asserte.raw_errors[0].loc==('nested','foo')asserte.raw_errors[0].text_loc==FileLocation(line=3,col=10,end_line=3,end_col=22)assertisinstance(e.raw_errors[0].exc,IntegerError)
提取字段文档
允许通过处理类定义的ast树来提取sphinx样式属性文档
frompydantic_settingsimportBaseSettingsModelclassFoo(BaseSettingsModel):classConfig:build_attr_docs=Truebar:str"""here is docs"""#: this style is't supported, but probably will be added in futurebaz:intassertFoo.__fields__['bar'].schema.description=='here is docs'assertFoo.__fields__['baz'].schema.descriptionisNone# :(
在线文档
阅读有关项目的详细文档 Read The Docs页。
开发设置
项目需要poetry进行开发设置。
- 如果你还没有
pip install poetry
- 安装项目依赖项
poetry install
- 运行测试
poetry run pytest .
太好了,一切正常!期望有一个可选步骤:
为预提交挂钩安装pre-commit
pip install pre-commit pre-commit install
这将安装预提交挂钩,它将使用flake8和black检查代码。
NOTE project uses black as code formatter, but i'am personally really dislike their "double quoted strings everywhere" style, that's why
black -S
should be used (anyway it's configured in pyproject.toml file)