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
我正在寻找一种在嵌套时将 dict 变回数据类的方法。像 C(**tmp)
这样的东西只有在数据类的字段是简单类型而不是它们本身的数据类时才有效。我熟悉 jsonpickle ,但是它带有一个突出的安全警告。
编辑:
答案建议使用以下库:
- 英安岩
- mashumaro(我用了一段时间,效果很好,但我很快就遇到了棘手的角落案例)
- pydantic(效果很好,优秀的文档和更少的角落案例)
原文由 mbatchkarov 发布,翻译遵循 CC BY-SA 4.0 许可协议
下面是
asdict
的 CPython 实现——或者具体来说,它使用的内部递归辅助函数_asdict_inner
:asdict
简单地调用上面的一些断言,和dict_factory=dict
默认情况下。1.添加类型信息
我的尝试涉及创建一个继承自
dict
的自定义返回包装器:查看原始代码,只需修改第一个子句即可使用此包装器,因为其他子句仅处理
dataclass
的 _容器_:进口:
使用的函数:
使用示例数据类进行测试:
结果如预期。
2. 转换回
dataclass
asdict
使用的递归例程可以重新用于反向过程,只需进行一些相对较小的更改:使用的函数:
测试:
再次如预期。