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][1],但它带有一个突出的安全警告。
编辑:
答案建议使用以下库:
- 英安
- mashumaro(我用了一段时间,效果很好,但我很快就遇到了棘手的角落案例)
- pydantic(效果很好,文档很好,极端案例更少)[1]:https ://jsonpickle.github.io/
解决方案
我是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
推荐阅读
- android - 关于 BroadcastReceiver 类的 Andoird WiFi Direct (P2P) 问题
- mongodb - MongoDB - 无法连接到服务器 127.0.0.1:27017,原因是:连接被拒绝:connect@src/mongo/shell/mongo.js:374:17
- julia - Julia (Julia-lang) 如何获取数据框的子集并按组计算不同的活动?
- react-native - How do I add custom title and button to a header in React Native?
- javascript - 如何在javascript中连接位?
- excel - Excel - 在 Win 10 中将多个离散项目复制到剪贴板
- python - 如何删除嵌套在列表中的元组?
- math - 贝塞尔曲线或 b 样条的通用数据结构是什么?
- python - 计算子列表中的出现次数
- json - 在flutter中通过代码删除本地JSON文件