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/