【发布时间】:2021-12-24 08:56:27
【问题描述】:
我想构造和解构一个 attrs 对象,其中包括使用简单 frozen 属性作为 dict 键的 dict 字段。这对于在运行时创建的对象非常有效,但是 freeze 属性无法使使用 cattrs 的 un/structuring 变得容易。
这是一个简单的问题示例:
import attr, cattr
# Simple attr that contains only a single primitive data type.
@attr.s(frozen=True)
class AbstractID:
_id: Optional[int] = attr.ib()
def __str__(self) -> str:
if self._id is not None:
return f"A{self._id}"
else:
return "—"
@attr.s(auto_attribs=True)
class Database:
storage: dict[AbstractID, str] = {}
# Attempt to unstructure using cattrs
db = Database()
db.storage[AbstractID(1)] = "some data"
cattr.unstructure(db)
>>> TypeError: unhashable type: 'dict'
在导入/导出过程之外,是否有某种方法可以在不使用 int 或 str 作为 dict 键的情况下序列化数据? 我看到 cattrs 提供了自定义序列化过程的钩子,但我不知道如何在非结构化时将 AbstractID 减少为 int,或者如何将其结构化回 AbstractID。
这个可以吗?
【问题讨论】:
-
那么你想要的最终结果是
{'storage': {1: 'some data'}}? -
是的,如果有办法将其重新构造回 Database.storage{AbstractID(1): "some data"}} 之后,那将是非常合适的。
标签: python json python-attrs