web-dev-qa-db-ja.com

フロッシュDataClassカスタム__init__メソッドに属性を設定する方法

スキーマを定義するが、実際には特定のメンバーでインスタンス化されていない@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でカスタム属性を設定できる方法はありますか?

8
Sasgorilla

@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)
 _
0
Max

DataClassesがあなたが探していた機能を提供していないことがわかりました。ただし、attrsはです。

from attr import attrs, attrib


@attrs(frozen=True)
class Name:
    name: str = attrib(converter=str.lower)
 _

同様の質問に対する同じ答え: https://stackoverflow.com/a/64695607/3737651

0