4

bar以下のデータクラスを凍結する簡単な方法を知りたいです。

@dataclass
class Bar:
    foo: int
bar = Bar(foo=1)

つまり、以下の機能が欲しいsome_fn_to_freeze

frozen_bar = some_fn_to_freeze(bar)
frozen_bar.foo = 2 # Error

そして、逆関数some_fn_to_unfreeze

bar = som_fn_to_unfrozen(frozen_bar)
bar.foo = 3 # not Error
4

3 に答える 3

3

dataclassそれに対する組み込みのサポートはありません。凍結性は、インスタンスごとではなく、クラス全体で追跡されます。データクラスの凍結または凍結解除された同等物を自動的に生成することはサポートされていません。

その場で新しいデータクラスを生成するために何かを試みることはできますが、それはisinstance==、およびその他の作業したいものとの相互作用が非常に不十分です。おそらく、2 つのデータクラスとコンバーター メソッドを記述するだけの方が安全です。

@dataclass
class Bar:
    foo: int
    def as_frozen(self):
        return FrozenBar(self.foo)

@dataclass(frozen=True)
class FrozenBar:
    foo: int
    def as_unfrozen(self):
        return Bar(self.foo)
于 2019-05-10T00:58:36.453 に答える