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