带有类继承的数据类的字典
问题描述
我有以下课程
@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)
相关文章