ネストされた辞書からのPythonデータクラス 質問する

ネストされた辞書からのPythonデータクラス 質問する

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

おすすめ記事