使用生成器模式创建数据类的实例。

dataclass-builder的Python项目详细描述


Build statusDocumentation statusTest coverageCode style is blackPyPI Package latest releaseSupported versionsStatusMIT

使用builder模式创建python数据类的实例。

要求

  • python 3.6或更高版本
  • dataclasses如果使用python 3.6

安装

数据类生成器位于PyPI上,因此最简单的安装方法是:

$ pip install dataclass-builder

用法

有两种方法可以使用数据类生成器。通过生成器实例或通过创建专用生成器。当需要重复构建给定的数据类或者docstring和类型检查很重要时,建议使用后者。

专用建设者(建设者工厂)

使用专门的构建器可以比dataclassbuilder包装器提供更好的文档。

fromdataclassesimportdataclassfromdataclass_builderimport(dataclass_builder,build,fields,updateREQUIRED,OPTIONAL)@dataclassclassPoint:x:floaty:floatw:float=1.0PointBuilder=dataclass_builder(Point)

现在我们可以建立一个点。

>>>builder=PointBuilder()>>>builder.x=5.8>>>builder.y=8.1>>>builder.w=2.0>>>build(builder)Point(x=5.8,y=8.1,w=2.0)

只要为其构造生成器的dataclass没有build字段,那么也将生成build方法。

>>> builder.build()
Point(x=5.8, y=8.1, w=2.0)

字段值也可以在构造函数中提供。

>>>builder=PointBuilder(x=5.8,w=100)>>>builder.y=8.1>>>builder.build()Point(x=5.8,y=8.1,w=100)

不允许位置参数。

在生成器中,dataclass中具有默认值的字段是可选的。

>>>builder=PointBuilder()>>>builder.x=5.8>>>builder.y=8.1>>>builder.build()Point(x=5.8,y=8.1,w=1.0)

dataclass中没有默认值的字段不是可选的。

>>>builder=PointBuilder()>>>builder.y=8.1>>>builder.build()Traceback(mostrecentcalllast):...MissingFieldError:field'x'ofdataclass'Point'isnotoptional

不能在生成器中设置数据类中未定义的字段。

>>>builder.z=3.0Traceback(mostrecentcalllast):...UndefinedFieldError:dataclass'Point'doesnotdefinefield'z'

对于以下划线开头的字段不会引发异常,因为它们是为子类保留的。

在设置前访问生成器的某个字段将提供所需的或可选的常量

>>>builder=PointBuilder()>>>builder.xREQUIRED>>>builder.wOPTIONAL

fields方法可用于检索生成器的可设置字段字典。这是字段名到dataclasses.field对象的映射,可以从中检索额外数据,例如存储在字段中的数据类型。

>>>list(builder.fields().keys())['x','y','w']>>>[f.type.__name__forfinbuilder.fields().values()]['float','float','float']

也可以检索字段的子集,例如,仅获取所需字段:

>>>list(builder.fields(optional=False).keys())['x','y']

或者只有可选字段。

>>>list(builder.fields(required=False).keys())['w']

如果底层dataclass有一个名为fields的字段,则不会生成此方法,而应改用fields函数。

使用update函数,可以使用部分完成的生成器更新已生成的dataclass

>>>point=Point(x=5.8,y=8.1,w=100)>>>update(point,PointBuilder(y=1.1))>>>pointPoint(x=5.8,y=1.1,w=100)

dataclass builders也可以更新,但冻结的dataclasses不能。

生成器实例(通用包装器)

使用builder实例是开始使用dataclass builder包的最快方法。

fromdataclassesimportdataclassfromdataclass_builderimport(DataclassBuilder,build,fields,REQUIRED,OPTIONAL)@dataclassclassPoint:x:floaty:floatw:float=1.0

现在我们可以建立一个点。

>>>builder=DataclassBuilder(Point)>>>builder.x=5.8>>>builder.y=8.1>>>builder.w=2.0>>>build(builder)Point(x=5.8,y=8.1,w=2.0)

字段值也可以在构造函数中提供。

>>>builder=DataclassBuilder(Point,x=5.8,w=100)>>>builder.y=8.1>>>build(builder)Point(x=5.8,y=8.1,w=100)

注意

不允许使用位置参数,除了dataclass本身。

在生成器中,dataclass中具有默认值的字段是可选的。

>>>builder=DataclassBuilder(Point)>>>builder.x=5.8>>>builder.y=8.1>>>build(builder)Point(x=5.8,y=8.1,w=1.0)

dataclass中没有默认值的字段不是可选的。

>>>builder=DataclassBuilder(Point)>>>builder.y=8.1>>>build(builder)Traceback(mostrecentcalllast):...MissingFieldError:field'x'ofdataclass'Point'isnotoptional

不能在生成器中设置数据类中未定义的字段。

>>>builder.z=3.0Traceback(mostrecentcalllast):...UndefinedFieldError:dataclass'Point'doesnotdefinefield'z'

注意

对于以下划线开头的字段不会引发异常,因为它们是为子类保留的。

在设置前访问生成器的某个字段将提供所需的或可选的常量

>>>builder=DataclassBuilder(Point)>>>builder.xREQUIRED>>>builder.wOPTIONAL

fields函数可用于检索生成器的可设置字段字典。这是字段名到dataclasses.field对象的映射,可以从中检索额外数据,例如存储在字段中的数据类型。

>>>list(fields(builder).keys())['x','y','w']>>>[f.type.__name__forfinfields(builder).values()]['float','float','float']

也可以检索字段的子集,例如,仅获取所需字段:

>>>list(fields(builder,optional=False).keys())['x','y']

或者只有可选字段。

^{p页R 22}$

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

推荐PyPI第三方库


热门话题
junit有没有办法在Java中重新初始化静态类?   在浏览器中点击应用程序时java Play框架挂起   文件Java错误中的NullPointerException   使用Java中的SNMP查找网络中计算机的登录名   java包装服务器引导程序已弃用,有什么替代方案?   当客户在等待理发时,java信号量值是否存在问题?   java如何使用JavaMail仅下载特定类型的附件   如何在java中将十进制转换为十六进制   java Slick2D粒子系统不会生成粒子   java检测更改事件来自何处   将Java集合类型参数类设置为数组   java如何从eclipse导出为可运行JAR文件?   java EntityManager对象未注入Glassfish和Spring   swing从actionPerformed和actionListener Java返回字符串   java在给定另一个等价键对象的情况下获取映射项的当前键   无论输入如何,java网络都会产生相同的输出