簡體   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