[英]When using Python dataclass where is the correct place to process the data for initializing the dataclass
在Python中,
我正在使用一个名为“ MyDataClass”的数据类来存储http响应返回的数据。 假设响应内容是这样的json,而我只需要前两个字段 :
{
"name": "Test1",
"duration": 4321,
"dont_care": "some_data",
"dont_need": "some_more_data"
}
现在我有两个选择:
选项1
resp: dict = The response's content as json
my_data_class: MyDataClass(name=resp['name'], duration=resp['duration'])
我利用dataclass的自动定义的init方法
要么
选项2
resp: dict = The response's content as json
my_data_class: MyDataClass(resp)
并将处理留给dataclass的init方法,如下所示:
def _ _ init _ _(self, resp: Response) -> None:
self.name: str = resp['name']
self.duration: int = resp['duration']
我更喜欢第二种选择,但我想知道是否有正确的方法。
谢谢。
你只需要对于现在的第一个2场。 直到您最终需要更多。 IMO可以更轻松地使用Dataclass的_ _init _ _()方法来解决此问题。 否则,您将必须同时更改函数调用(MyDataClass(name = .....))和数据类init。 使用第二个选项,您只有一个地方需要干预。
除非不关心/不需要,这是巨大的,并且因此而使性能受到冲击……过早的优化是万恶之源。 因此,请尽可能保持其简单和灵活!
假设在将来,您想从response
提取更多数据并将其存储在Dataclass
,在选项1中:您将需要增加__init__
方法的参数以及初始化Dataclass
所有位置。 因此,选项2是可取的,因为它减少了代码冗余并将数据提取逻辑保持在一个位置。
您应该绝对避免覆盖数据类的__init__
函数。 有很多魔术会因覆盖而丢失。 除其他事项外,您将无法进行正确的__post_init__
函数调用,除非您自己重写它。 这不是小事。
dataclass
这种方式工作的原因是,它被认为是业务数据到程序结构的非常简单的一对一映射。 结果,您添加的每种与该核心思想无关的附加逻辑都失去了dataclass
的用处。
因此,我建议您坚持选择1。
如果手动写出想要的属性变得很麻烦,则可以考虑编写一个类方法,该方法为您过滤掉不需要的属性,并允许您像下面这样喷洒字典:
dataclass_instance = MyDataClass.from_request(**resp)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.