Python 3.7では、事前定義された特別な関数を持つ新しいdataclasses
が提供されます。
概要の点から、dataclasses
とSimpleNameSpace
はどちらも、ニースデータカプセル化機能を提供します。
@dataclass
class MyData:
name:str
age: int
data_1 = MyData(name = 'JohnDoe' , age = 23)
data_2 = SimpleNameSpace(name = 'JohnDoe' , age = 23)
多くの場合、データをラップして移動するためだけにSimpleNameSpace
を使用します。
私はそれをサブクラス化して特別な機能を追加します:
from types import SimpleNameSpace
class NewSimpleNameSpace(SimpleNameSpace):
def __hash__(self):
return some_hashing_func(self.__dict__)
私の質問:
SimpleNameSpace
とdataclasses
のどちらを選択するのですか?SimpleNameSpace
を拡張しても同じ効果が得られるのに、なぜそれらが必要だったのですか?dataclasses
は何に対応しますか?簡単に言えば、これはすべて PEP 557 でカバーされます。質問の順序が少し狂っています...
PEPは、それらが代替ではなく、他のソリューションが独自の場所を持つことを期待していることは非常に明確です。
したがって、他の設計上の決定と同様に、気になる機能を正確に決定する必要があります。以下が含まれている場合、データクラスは絶対に必要ありません。
データクラスを使用することが適切ではない場所はどこですか?
タプルまたは辞書とのAPI互換性が必要です。 PEP 484および526で提供されるものを超える型の検証が必要です。または、値の検証または変換が必要です。
そうは言っても、SimpleNameSpaceについても同じことが言えるので、他に何を見れば判断できるでしょうか。データクラスによって提供される追加機能を詳しく見てみましょう...
SimpleNameSpaceの既存の定義は次のとおりです。
名前空間への属性アクセスと、意味のあるreprを提供する単純なオブジェクトサブクラス。
python docs次に、シンプルな__init__
、__repr__
および__eq__
実装。これをPEP 557と比較すると、データクラスには次のオプションもあります。
明らかに、順序付けや不変性を気にする場合(またはニッチなハッシュ制御が必要な場合)は、データクラスを使用する必要があります。
私が見ることはできませんが、最初の「なぜ?」他のユースケースをカバーします。
Dataclassesはnamedtuple
よりもSimpleNamespace
および人気のある attrs パッケージに似ています(これは PEP でさえ言及されていません)。彼らは2つの異なる意図された目的を果たします。
データクラス
__init__
_、___hash__
_、___eq__
_など)__slots__
_とメソッドを簡単に追加できますSimpleNamespace
__slots__
_のようなものを使用することを意図していませんSimpleNamespace
ドキュメントから:
SimpleNamespaceは、_
class NS: pass
_の代わりとして役立ちます。ただし、構造化レコードタイプの場合は、代わりにnamedtuple()
を使用してください。
_@dataclass
_はnamedtuple
の多くのユースケースを置き換えることになっているため、名前付きレコード/構造体はSimpleNamespace
ではなく_@dataclass
_で実行する必要があります。
また、 このPyConのレイモンドヘッティンガーによる講演 を参照することもできます。この場合、彼は_@dataclass
_のバックストーリーに入り、それを使用しています。