带有类继承的数据类的字典

问题描述

我有以下课程

@dataclass_json
@dataclass
class Input:
    sources: List[Sources] =None
    Transformations: List[str] =None

以及:

@dataclass_json
@dataclass
class Source:
    type: str =None
    label: str =None
    path: str = None

和两个子类:

@dataclass_json
@dataclass
class Csv(Source):
    csv_path: str=None
    delimiter: str=';'

@dataclass_json
@dataclass
class Parquet(Source):
    parquet_path: str=None

现在给出词典:

parquet={type: 'Parquet', label: 'events', path: '/.../test.parquet', parquet_path: '../../result.parquet'}
csv={type: 'Csv', label: 'events', path: '/.../test.csv', csv_path: '../../result.csv', delimiter:','}
input={'sources':[csv, parquet]}

现在我想做一些类似

的事情
Input().from_dict(input) 

输出:

Input(sources: [Parquet(...), Csv(...)]).

这实际上是可行的,但它只返回来自DataClassSource的3个参数(类型、标签和路径)的值,而不是CSV和Parket的其他特定参数(CSV_PATH、DELIMITER和PARQUT_PATH),这些参数只是给出了默认值。这可能是因为库dataclass_json在初始化某个类之前采用了它的模式。另一方面,我仍然想使用dataclass_json,只做一个包装器,因为它有很好的案例和错误处理能力。

我想要这种行为,因为每个源类型都有不同的参数来定义自己(例如,CSV有分隔符,而Parquet没有,等等)。

我在尝试获取类源并在库dataclass_json中找到子类时遇到了困难。执行此操作时,我遇到

cls.__args__[0]

它的类型为‘GenericMeta’。但鉴于此,我无法访问它的子类。

有什么解决办法吗?

顺便说一下,我正在使用Python3.6。

提前感谢您的帮助。


解决方案

我知道这个帖子已经很久了,但是对于其他正在寻找解决方案的人来说,可以看看英安岩。

以下是指向他们的GitHub存储库的链接:https://github.com/konradhalas/dacite#quick-start

为了完整起见,以下是快速入门代码:

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)

相关文章