3.7 の標準ライブラリは、データクラスを辞書に再帰的に変換できます (ドキュメントからの例):
from dataclasses import dataclass, asdict
from typing import List
@dataclass
class Point:
x: int
y: int
@dataclass
class C:
mylist: List[Point]
p = Point(10, 20)
assert asdict(p) == {'x': 10, 'y': 20}
c = C([Point(0, 0), Point(10, 4)])
tmp = {'mylist': [{'x': 0, 'y': 0}, {'x': 10, 'y': 4}]}
assert asdict(c) == tmp
ネストがある場合に辞書をデータクラスに戻す方法を探しています。これは、C(**tmp)
データクラスのフィールドが単純な型であり、それ自体がデータクラスではない場合にのみ機能します。私はjsonpickleただし、これには目立つセキュリティ警告が伴います。
編集:
回答では次のライブラリが提案されています:
- デイサイト
- mashumaro (しばらく使用しましたが、うまく機能しましたが、すぐに厄介なコーナーケースに遭遇しました)
- pydantic (非常にうまく機能し、優れたドキュメントとコーナーケースが少ない)
ベストアンサー1
私はdacite
- 辞書からのデータ クラスの作成を簡素化するツール。
このライブラリには関数が 1 つだけありますfrom_dict
。これは使用方法の簡単な例です。
from dataclasses import dataclass
from dacite import from_dict
@dataclass
class User:
name: str
age: int
is_active: bool
data = {
'name': 'john',
'age': 30,
'is_active': True,
}
user = from_dict(data_class=User, data=data)
assert user == User(name='john', age=30, is_active=True)
さらに、dacite
以下の機能もサポートしています:
- ネストされた構造
- (基本) 型チェック
- オプションフィールド(例:typing.Optional)
- 労働組合
- コレクション
- 価値観の転換と変容
- フィールド名の再マッピング
...そして十分にテストされています - 100% コード カバレッジ!
dacite をインストールするには、pip (または pipenv) を使用するだけです。
$ pip install dacite