通过pydantic验证的环境变量配置程序。

umwelt的Python项目详细描述


umwelt

使用dataclassespydantic和 以静态类型友好的方式从环境中加载值。

示例

平坦

>>>os.environ["APP_HOSTS"]='["b.org","sky.net"]'>>>os.environ["APP_TOKEN"]="very secret"
fromtypingimportSequencefrompydanticimportSecretStrimportumweltclassMyConfig:hosts:Sequence[str]token:SecretStrreplicas:int=2config=umwelt.new(MyConfig,prefix="app")
>>>dataclasses.is_dataclass(config)True>>>config.hosts["b.org","sky.net"]>>>config.tokenSecretStr('**********')>>>config.replicas2

嵌套

>>>os.environ["APP_DB_PORT"]="32"
from__future__importannotations# for forward-referencesfrompydanticimportUrlStrimportumweltclassMyConfig:db:DbConfighost:UrlStr="http://b.org"@umwelt.subconfigclassDbConfig:port:intdebug:bool=Falseconfig=umwelt.new(MyConfig,prefix="app")
>>>config.host"http://b.org">>>config.db.port32

安装

$ pip install umwelt

功能

Umwelt.新

umwelt.new需要一个位置参数:要填充的配置类。 umwelt将把它转换成一个dataclass如果它还不是。

umwelt.new也接受命名参数:

  • source(默认情况下os.environ)是一个Mapping[str, str],从中 将提取值。
  • prefix可以是字符串或可调用的。作为一个字符串,它被预先设置为 配置字段的名称。作为可调用的,它接收配置字段的名称和 其结果是源密钥名。
  • decoder是可调用的,需要类型和字符串,并返回 该字符串在该类型或pydantic可以转换的类型中的转换 在那种类型。 例如,当使用(List[Set[int]]调用umwelt的默认decoder时, "[[1]]"),它只是从json中解码字符串,然后返回 lists,pydantic将其正确转换为sets的列表。

@子图

@umwelt.subconfig标记类,以便当它们显示为字段注释时 在另一个配置类中,umwelt.new不会从单个 source值,而不是来自每个类字段的一个source

示例:

classPoint:# no @subconfigdef__init__(self,s:str):# string inputself.x,self.y=s.split(",",1)# arbitrary implementationclassMyConf:point:Pointconf=umwelt.new(MyConf,source={"POINT":"1,2"})# one source entryconf.point# <Point at 0x7f07b1d04750>

conf.pointpoint的一个实例,通过传递输入值"1,2"来构建。 直接发送到Point.__new__。 只有一个source键:POINT

现在与@umwelt.subconfig

@umwelt.subconfigclassPoint:x:inty:intclassMyConf:point:Pointconf=umwelt.new(MyConf,source={"POINT_X":"1","POINT_Y":"2"})conf.point# Point(x=1, y=2)

conf.point仍然是point的实例(point已被 由umwelt生成的数据类,因此是自动的__str__实现)。 有2个source键:POINT_XPOINT_Y,每个对应于 point类的字段。

与生态学比较

我用Ecological很久了。 今天,Ecologic的大部分代码库实现了已经发现的特性 在较成熟的dataclassespydantic中。 我相信生态系统的设计可以大大简化,并通过 严格区分关注点:

  • 类脚手架是dataclasses的责任(相比之下 对于元类来说,更简单、更内省,并且附带了诸如 asdict);
  • 类型强制和验证是pydantic(它具有 更多功能,如嵌套数据类型、json模式、序列化等);
  • pydantic架构(配置类)映射到字符串到字符串 dict(likeos.environ)是umwelt的职责。

一些破坏兼容性的决定阻止在生态环境中执行此操作:

  • 不要自动加载配置值,尤其是在类定义时。 相反,只提供一个加载配置的函数(umwelt.new) 当它被调用时。
  • 不要将变量前缀绑定到配置类,因为这不起作用 以及嵌套配置。

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

推荐PyPI第三方库


热门话题
java如何在部署在Tomcat7上的jbpmconsole中添加新用户?   JavaStruts2:我分配了一个参数的值,但在jsp文件中得到了一个空指针错误   检查类是否在同一个包或子包中访问的java ArchUnit规则?   java当您使用spring forward重定向到其他控制器时,如何从ModelAndView返回响应对象?   java jsp/servlet,显示管理员、用户和未登录用户的不同链接   java Eclipse警告消息   java加载多纹理openGL   java有没有一种方法可以通过Hibernate传递一个对象(genaric)并填充任何字段,然后让它返回一个包含所有字段的对象列表?   java如何将git存储url连接到本地存储库,以便每次都获得更新的代码?   java无限循环在程序中无法正常工作   java File writer正在写入没有“换行”的字符串   java为什么Spring或C3p0没有清理C3p0线程?   java通过JDBC从PostgreSQL检索几何数组