首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >棉花糖嵌套序列化具有基类模式的列表,以满足子类模式类的要求

棉花糖嵌套序列化具有基类模式的列表,以满足子类模式类的要求
EN

Stack Overflow用户
提问于 2020-12-03 16:20:46
回答 1查看 945关注 0票数 0

我使用marshmallow-dataclass构建可序列化的类,并将它们嵌套在列表中的另一个类下。

有一个Base数据集,它是一个抽象类,具有实现的大部分功能,还有@abcmethod。从基础上,创建了其他数据类型;将有多个变体,所有这些都是从Base子类中得到的。这些子类能够很好地独立工作。

我打算将所有实例附加到.items下的一个.items数据集中。然后能够将其序列化和反序列化。

以下是我所拥有的一个简化版本:

代码语言:javascript
复制
from abc import ABC, abstractmethod
from typing import List, Tuple
import marshmallow_dataclass
from dataclasses import dataclass

@dataclass
class Base(ABC):
    name: str
    # _klass: str = None

@marshmallow_dataclass.dataclass
class NameAge(Base):
    age: int

@marshmallow_dataclass.dataclass
class NameLocation(Base):
    loc: Tuple[float, float]

@marshmallow_dataclass.dataclass
class Store:
    items: List[Base]

下面是一个打算使用的例子:

代码语言:javascript
复制
a1 = NameAge('John', 33)
a2 = NameLocation('Bob', (50.8, -0.1))

store = Store(items=[a1, a2])

payload = Store.Schema().dump(store)

store_again = Store.Schema().load(payload)

# desired outcome
assert store == store_again

问题

  • 在加载/转储Store实例时,Base类架构用于.itemsBase被声明为列表中的类型,因此基用于将.Schema()构建为序列化程序。但是,所需的行为是将每个实例序列化其专用类.

到目前为止我尝试了什么,

success.

  • Tried
  • dataclass属性_klass用于序列化和跟踪所使用的类,因此可以构建正确的序列化程序。
  • 尝试创建一个基本模式(如@marshmallow_dataclass.dataclass(base_schema=BaseSchema)),试图拦截@pre_dump@pre_load,但不使用构造函数Base.__new__拦截大量的Base.__new__来返回正确的模式类,但似乎没有在反序列化阶段调用H 232F 233

如有任何建议或帮助,将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2021-07-05 08:51:46

模式不是继承的:反序列化如何知道一个类的子类?而是使用typing.Union

代码语言:javascript
复制
from abc import ABC, abstractmethod
from typing import List, Tuple, Union

...

@marshmallow_dataclass.dataclass
class Store:
    items: List[Union[NameAge, NameLocation]]

您需要额外安装unionpip install marchmallow-dataclass[union]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65129889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档