Pythonのdataclassを知る
dataclassがよく分からなかった
たまに、dataclassを使っているコードを見かけて、今までよくわからずあまり気にせず雰囲気でよんでいたのですが、知らないと困ることがでてきたので少し調べてみました。
公式情報としては、PEP-557にかかれています。
読んでもよく使いどころが分かりませんね。というわけで、疑問点を1つ1つ確認していきます。
dataclassはデコレータをつかう必要がある
そもそもデコレータがあんまり分かってなかったり…以下がわかりやすかったです。
デコレータは、関数、クラスの前に@xxxx
と書くことで使えるようになります。デコレータは、修飾という意味ですが、Pythonでは関数やクラスに特定の処理を追加することができるようです。ラッパー的なやつですね。
dataclassを使うときは@dataclass
とデコレータとして使うわけですが、じゃあdataclass
の実態はどんなコードなのかというと、以下にあります。
はい、コード読んでも全然ピンときませんね。
dataclass使い方
実際に使ってみて、身体で覚えてみることにしましょう。
例えば以下みたいなKaraage
クラスがあったとします(謎の例)
class Karaage():
def __init__(self):
self.name = 'karaage'
self.option = []
データクラスを使って書くと以下のようにかけます。
from dataclasses import dataclass, field
@dataclass
class Karaage():
name: str = 'karaage'
option: list = field(default_factory=list)
dataclassを使うと便利な点
ポイント
- 初期化が楽(
def __init__(self)
とか書かなくてよい) - 型アノテーションしやすい
- dictとかjsonに変換しやすい(参照: Python3.7で導入されたdataclass入門)
- エディタの補完が使いやすくなる
中身を確認しやすい
インスタンスを確認するとき、普通にクラスで書くと以下のようにオブジェクトであることとアドレスが表示されます。
>>> karaage = Karaage()
>>> print(karaage)
<__main__.Karaage object at 0x1031c3cd0>
これが、データクラスを使って書くと、以下のように中身を表示してくれてちょっと見やすいです。
>>> karaage = Karaage()
>>> print(karaage)
Karaage(name='karaage', option=[])
一括でイミュータブルにできる
できるらしいです。
@dataclass(frozen=True)
class Karaage():
name: str = 'karaage'
option: list = field(default_factory=list)
dataclass使いどころ
データの格納がメインのクラスに使うというのが、基本的な使い方みたいです。
とりあえず全部クラスはdataclass
にしてしまえばよいのでは?という考え方もありそうですが、あまり一般的ではないようです。
Twitterでのコメント
まとめ
dataclassを調べてみました。
ものすごい便利とは個人的には感じませんでしたし、無理して使うことはないような印象を受けましたが、使っているコードたまにみかけるので、知っておいたほうが良いですね。
いくつか例をみると、さらに便利さに気づくかもしれません。そしたらこの記事に追記したいと思います。
参考
公式
解説記事
参考リンク
関連記事
Discussion