繁体   English   中英

使用Python数据类时,哪里是处理数据以初始化数据类的正确位置

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM