Словарь к классам данных с наследованием классов - PullRequest
0 голосов
/ 01 мая 2020

У меня есть следующий класс

@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(...)]).

Это на самом деле работает, но возвращает только 3 параметра из источника данных (тип, метка и путь), а не другие указанные c параметры Csv и Parquet (csv_path, delimiter и parquet_path), которые просто учитывая его значение по умолчанию. Это может быть связано с тем, что библиотека dataclass_ json взяла схему класса перед его инициализацией. С другой стороны, я хотел бы по-прежнему использовать dataclass_ json и просто сделать обертку, поскольку она хорошо обрабатывает регистры и ошибки.

Мне нужно такое поведение, поскольку каждый тип источника имеет разные аргументы, которые определяют себя (например, Csv имеет разделители, а Parquet - нет, et c. ...).

Я изо всех сил пытался получить класс Source и найти подклассы в библиотеке dataclass_ json. При этом я столкнулся с

cls.__args__[0]

, который имеет тип 'GenericMeta'. Но, учитывая это, я не смог получить доступ к его подклассам.

Есть ли какая-нибудь работа вокруг?

Кстати, я использую Python 3.6.

Заранее спасибо за вашу помощь.

...