環境設定 数値 文字列 正規表現 リスト タプル 集合 辞書 ループ 関数 クラス データクラス 時間 パス ファイル スクレイピング その他

Python データクラスのインスタンスを辞書にする : asdict が __dict__ より強力な理由

Python の asdict はデータクラスのインスタンスを辞書にします。

from dataclasses import dataclass, asdict


@dataclass
class User:
    id: int
    name: str


a = User(id=2, name='Alice')
d = asdict(a)

print(d)  # {'id': 2, 'name': 'Alice'}

下のコードを見ると asdict__dict__ と変わらない印象をもちます。

from dataclasses import dataclass, asdict


@dataclass
class User:
    id: int
    name: str


a = User(id=2, name='Alice')

x = asdict(a)
y = a.__dict__

print(x)  # {'id': 2, 'name': 'Alice'}
print(y)  # {'id': 2, 'name': 'Alice'}

asdict は dataclass のインスタンスをもつ変数も辞書にする

from dataclasses import dataclass, asdict


@dataclass
class Person:
    name: str
    age: int


@dataclass
class User:
    id: int
    person: Person


a = User(id=2, person=Person(name='Alice', age=28))

x = asdict(a)
y = a.__dict__

print(x)  # {'id': 2, 'person': {'name': 'Alice', 'age': 28}}
print(y)  # {'id': 2, 'person': Person(name='Alice', age=28)}

__dict__ は person の値(データクラスのインスタンス)を辞書にしていません。どうせだったら Person(name='Alice', age=28) も辞書にしてくれたら…という願いをきくのが asdict です。

asdict : 入れ子も対応
__dict__ : 入れ子は非対応

Python データクラス