来自嵌套字典的 Python 数据类

标签 python python-3.x python-dataclasses

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(效果很好,文档出色,极端案例更少)

最佳答案

我是 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

关于来自嵌套字典的 Python 数据类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53376099/

相关文章:

python - Django 2.0 身份验证 View 中 Reset Done 和 reset Complete 的区别

python-3.x - Beam Streaming 管道不会将文件写入存储桶

python - 子进程 stdin PIPE 在程序终止之前不会返回

python - 你能在每次修改另一个字段时修改一个对象的字段吗?

python - 具有复杂字段的数据类继承

python - 如何使用通用 View 重定向登录用户查看 Django 中的登录页面

python - 使用 RE 进行文本替换 - 允许第一次出现,替换其余的

python - 如何在 Pandas 表的时间间隔内获取具有 DatetimeIndex 的行?

python - 将 pyaudio 安装到 docker 容器