スキーマを定義するが、実際には特定のメンバーでインスタンス化されていない@dataclass
を構築しようとしています。 (基本的に、私は他の目的のために便利な@dataclass
構文をハイジャックしています)。これはほとんど私が欲しいものをします。
@dataclass(frozen=True, init=False)
class Tricky:
thing1: int
thing2: str
def __init__(self, thing3):
self.thing3 = thing3
しかし、__init__
メソッドでFrozenInstanceError
を取得します。
dataclasses.FrozenInstanceError: cannot assign to field 'thing3'
frozen=True
(ハッシュ性の場合)が必要です。フリーズ__init__
で@dataclass
でカスタム属性を設定できる方法はありますか?
@shmuelH.投稿は私のために働かなかった、それでもFrozenInstanceError
を上げました。
これは私のために働いたものです。
ここでやっているのは、strptime
関数で定義されている形式と互換性があるかどうかをチェックし、それが割り当てられている場合は、それが割り当てられていない場合は、そのinitへの値を確認します。
@dataclass(frozen=True)
class Birthday:
value: InitVar[str]
date: datetime = field(init=False)
def __post_init__(self, value: str):
try:
self.__dict__['date'] = datetime.strptime(value, '%d/%m/%Y')
except Exception as e:
print(e)
_
DataClassesがあなたが探していた機能を提供していないことがわかりました。ただし、attrsはです。
from attr import attrs, attrib
@attrs(frozen=True)
class Name:
name: str = attrib(converter=str.lower)
_
同様の質問に対する同じ答え: https://stackoverflow.com/a/64695607/3737651