こんにちは、PyQチームです。今回はPythonのdataclass
のオブジェクトと辞書の相互変換について紹介します。
Pythonのdataclass
のオブジェクトと辞書の相互変換
辞書は、任意の文字列をキーとして使えますが、キーの名称を固定できた方が便利なことがあります。
その方法として、下記のようにdataclasses
モジュールのdataclass
が使えます。
from dataclasses import dataclass, asdict @dataclass class Author: name: str author1 = Author(name="夏目漱石") print(author1)
実行結果
Author(name='夏目漱石')
name: str
のstr
のような書き方を型ヒントといいます。dataclass
は型ヒントを使うことが特徴です。
また、このdataclass
のオブジェクト(author1
)は、次のようにasdict()
を使って辞書に変換できます。
dct = asdict(author1)
print(dct)
実行結果
{'name': '夏目漱石'}
逆に、辞書からdataclass
のオブジェクトを作成できます。
print(Author(**dct))
実行結果
Author(name='夏目漱石')
このように、dataclass
のオブジェクトと辞書を相互変換できますが、ネストしている(入れ子になっている)要素は、辞書からオブジェクトになりません。ネストのクラスを使って確認してみましょう。
@dataclass class Book: title: str authors: list[Author] book1 = Book(title="坊っちゃん", authors=[author1]) print(book1) dct = asdict(book1) print(dct) print(Book(**dct))
実行結果
Book(title='坊っちゃん', authors=[Author(name='夏目漱石')]) {'title': '坊っちゃん', 'authors': [{'name': '夏目漱石'}]} Book(title='坊っちゃん', authors=[{'name': '夏目漱石'}])
上記のように、Book(**dct)
のauthors
の要素が辞書のままです。
pydantic
モジュールのdataclass
を使った相互変換
本ブログでは、ネストしていても相互変換になる方法を紹介します。
その方法は、dataclasses
モジュールではなく、pydantic
モジュールのdataclass
を使う方法です。
pydantic
は、型ヒントを使ってデータのバリデーションなどをサポートする、サードパーティ製のライブラリです。
実際に確認してみましょう。下記は、インポート文以外は先ほどと同じ記述ですが、辞書から変換したauthors
の要素がAuthor
になっています。
from pydantic.dataclasses import dataclass @dataclass class Author: name: str @dataclass class Book: title: str authors: list[Author] author1 = Author(name="夏目漱石") book1 = Book(title="坊っちゃん", authors=[author1]) print(book1) dct = asdict(book1) print(dct) print(Book(**dct))
実行結果
Book(title='坊っちゃん', authors=[Author(name='夏目漱石')]) {'title': '坊っちゃん', 'authors': [{'name': '夏目漱石'}]} Book(title='坊っちゃん', authors=[Author(name='夏目漱石')])
pydantic
モジュールのバリデーション
pydantic
モジュールのdataclass
は、dataclasses
モジュールのdataclass
と同様に使えますが、型ヒントを使ってバリデーションも行います。
たとえば、下記を実行すると、タイトルが文字列ではなく整数のため、ValidationErrorになります(dataclasses
モジュールではエラーになりません)。つまり、間違ったデータが入ると気づきやすくなります。
このように、pydantic
は主にバリデーションを目的として使われることが多いです。
dct = {"title": 0, "authors": []} print(Book(**dct))
実行結果
--------------------------------------------------------------------------- ValidationError Traceback (most recent call last) (中略) ValidationError: 1 validation error for Book title Input should be a valid string [type=string_type, input_value=0, input_type=int] For further information visit https://errors.pydantic.dev/2.6/v/string_type
なお、pydantic
モジュールは(dataclasses
モジュールと違って)標準モジュールではないため、下記のようにインストールが必要です。
pip install pydantic
まとめ
pydantic
モジュールのdataclass
、あるいは、dataclasses
モジュールのdataclass
を使うと、オブジェクトと辞書を相互に変換できます。- ただし、
dataclasses
モジュールでは、ネストしていると辞書から適切にdataclass
のオブジェクトに変換できません(pydantic
ではできます)。
- ただし、
pydantic
では、型ヒントを使ってバリデーションを行います。pydantic
を使うには、インストールが必要です。
PyQでは下記からdataclasses
モジュールのdataclass
について学べます。dataclass
について興味を持ちましたら確認してみてください。
- クエスト「dataclassesライブラリー」