使用生成器模式创建数据类的实例。
dataclass-builder的Python项目详细描述
使用builder模式创建python数据类的实例。
要求
- python 3.6或更高版本
- dataclasses如果使用python 3.6
用法
有两种方法可以使用数据类生成器。通过生成器实例或通过创建专用生成器。当需要重复构建给定的数据类或者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}$