簡體   English   中英

如何用列表的副本初始化數據類字段?

[英]How to initialize dataclass field with a copy of a list?

我正在解析具有以下行結構的文本文件:

name_id,寬度,[其他]

解析輸入后,我將每個解析的行輸入dataclass

@dataclass(frozen=True, eq=True)
class Node():
    name: str
    rate: int
    other: list[str] = field(compare = False)

在代碼的中間,我從other中刪除了值,這導致從原始解析輸出中刪除了值。 我不想要那個。 如何使dataclass強制復制列表?

據我了解,在普通班級,解決方案是:

self.other = other.copy()

但如果這樣做,我應該重寫整個init方法,這破壞了dataclass的目的。

那么如何用列表的副本初始化dataclass字段呢?

我試過這樣做:

def __post_init__(self):
    setattr(self, 'other', self.other.copy())

哪個 yield 不能分配凍結實例的屬性。

恕我直言,這是個壞主意,看起來像是打破了“顯式優於隱式”的格言 但是如果你真的想要,你可以用object.__setattr__破解強制它:

@dataclass(frozen=True, eq=True)
class Node:
    name: str
    rate: int
    other: list[str] = field(compare=False)

    def __post_init__(self):
        object.__setattr__(self, 'other', self.other.copy())

解釋

object.__setattr__是默認的 python __setatter____setattr__使用類的__setattr__方法,在dataclass的情況下被覆蓋以確保用戶不會更改凍結dataclass的字段(因此您跳過檢查)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM