使用数据类在Python中配置文件

424 阅读4分钟

使用数据类在Python中对配置文件进行类型安全的解析

图片由作者提供

TL;DR

有了Python数据类和新的dataconf库,我们现在可以对配置文件进行类型安全的解析,使之成为数据类。对于来自Scala的用户来说,这是一个从案例类和PureConfig类型安全解析的轻松过渡。要看Python和PySpark使用案例的例子,请跳转到用法

简介

啊,配置文件。人们必须爱它们,对吗?也许吧?这取决于。对于那些使用Scala和其他JVM语言的人来说,我们可以使用HOCON,一种人类可读的json格式,typesafe config和pureconfig来轻松地将复杂的配置或属性文件直接载入案例类中。解决了这个问题,日子就好过了。那我们的Python用户呢?

medium.com/media/17488…

数据类的引入

在 Python 3.7 中,数据类被引入,通过简单的 pip 安装,向后兼容 Python 3.6。通过这个引入,Python本质上引入了一个可变格式的Scala案例类。然而,数据类可以被冻结以实现不可变的变体。有了这个介绍,我们的Python用户可以实现同样的配置文件的精简解析吗?嗯,还没有。确实PyHocon已经存在了很多年,但是仍然缺少一些东西。2020年5月,Github用户@zifeo将他的库dataconf发布到PyPI上,这是链条上的最后一环。

medium.com/media/a2853…

dataconf库

dataconf的作用是,它允许用户读入带有定义参数的配置文件,并直接输入到Python数据类中。我是在2021年8月左右偶然发现这个库的,当时我正在寻找一种能将配置文件轻松传入Python的方法。根据我在Scala的经验和对Python数据类的了解,我很高兴看到这种能力。在过去的几个月里,我增加了一些额外的功能,并在0.1.5、0.1.6和0.2.0版本中发布,进一步复制了pureconfig。目前,dataconf已经迅速成熟,现在已经是0.3.0版本。由于缺少Python 3.7.x中没有的更新,dataconf只能在Python >= 3.8.x上工作。

True Digital Group,我们正在开发一个定制的MLOps管道,以Python的自动化方式为我们的用户和客户提供服务。然而,为了协调这些管道,我们将采用类似于我们在Scala中建立的数据管道的配置文件。我增加了解析嵌套配置的能力,并使用Python中的抽象基类dataclasses来模仿Scala的密封特征的行为。这个库可能并不完美,但它是我们现在可以依赖的Python管道需求。

为了使用dataconf,用户的入口点将主要是load和load。然而,如果传递ConfigTree对象,他们将需要使用__parse。目前的计划是在未来的版本中,将使用方法重构为类似于 pureconfig 的 from_config、from_file 和 from_string 或其他类似模式。在这里可以找到一个带有代码的演示 repo。最后一点,0.2.0及以下版本不能解析-,所以请使用0.2.1及以上版本。

使用实例

假设我们需要运行一个管道,接收数据或数据源,做一些处理并将数据写出来。然而,数据可能来自Python中许多不同的文件格式,或来自一个表、sql查询或HDFS路径。在这样的情况下,使用一个配置文件、dataclasses和dataconf可以简化我们的工作,避免分支。在例子中,我使用抽象元类来处理不同的输入类型。有了这个,我可以让PipeParams或Params处理决定数据类的匹配。所有的类都带有load_df,所以我们可以使用相同的方法名调用来加载数据帧,不管是哪种解析的。下面的例子只是对如何使用数据类和dataconf来简化你的生产编码的表面认识。

medium.com/media/116ae…

原文发表于 https://tech.trueanalytics.ai 于2021年10月25日。


使用dataclasses的Python配置文件最初发表在Medium上的Towards Data Science,在那里人们通过强调和回应这个故事继续对话。