首页 > 解决方案 > 来自嵌套字典的 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][1],但它带有一个突出的安全警告。


编辑:

答案建议使用以下库:

标签: pythonpython-3.xpython-dataclasses

解决方案


我是dacite简化从字典创建数据类的工具的作者。

这个库只有一个功能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支持以下功能:

  • 嵌套结构
  • (基本)类型检查
  • 可选字段(即打字。可选)
  • 工会
  • 收藏品
  • 价值观铸造和转型
  • 重新映射字段名称

...而且它经过了很好的测试 - 100% 的代码覆盖率!

要安装 dacite,只需使用 pip(或 pipenv):

$ pip install dacite

推荐阅读