Преобразование файла YAML в класс данных с вложенными классами данных и необязательными аргументами ключевых слов.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Преобразование файла YAML в класс данных с вложенными классами данных и необязательными аргументами ключевых слов.

Сообщение Anonymous »

Я хочу прочитать файл YAML и преобразовать его в класс данных Python. Целью этого примера является создание одного и того же класса данных.
Без чтения файла YAML:

Код: Выделить всё

from dataclasses import dataclass, field

@dataclass
class OptionsSource:
a: str
b: str = None
kwargs: dict = field(default_factory=dict)

def __post_init__(self):
for k, v in self.kwargs.items():
setattr(self, k, v)

@dataclass
class OptionsInput:
file: str
source: list[OptionsSource] = field(default_factory=list[OptionsSource], kw_only=True)

@dataclass
class Options:
inputs: OptionsInput = field(default_factory=OptionsInput, kw_only=True)

options = Options(
inputs=OptionsInput(
file='file1',
source=[
OptionsSource(a=1, b=2, kwargs={'c': 3}),
OptionsSource(a=10, b=20)
]
))

Код: Выделить всё

>>>print(options)
Options(inputs=OptionsInput(file='file1', source=[OptionsSource(a=1, b=2, kwargs={'c': 3}), OptionsSource(a=10, b=20, kwargs={})]))

Код: Выделить всё

>>>print(options.inputs.source[0].c)
3
Теперь, когда я читаю этот YAML, мои выходные данные отличаются (т. е. класс данных OptionsSource не используется).

Код: Выделить всё

yaml_input = yaml.load("""
inputs:
file: file1
source:
- a: 1
b: 2
c: 3
- a: 10
b: 20
""", Loader=yaml.FullLoader)

options_from_yaml = Options(inputs=OptionsInput(**yaml_input['inputs']))

Код: Выделить всё

>>>print(options_from_yaml)
Options(inputs=OptionsInput(file='file1', source=[{'a': 1, 'b': 2, 'c': 3}, {'a': 10, 'b': 20}]))
Мне нужен результат, чтобы options_from_yaml соответствовал параметрам.
Мои две проблемы:
  • не является списком OptionsSource
  • Я не могу понять, как часть kwargs OptionsSource позволяет мне предоставить любые аргументы ключевого слова и сохраните их, чтобы к ним можно было получить доступ с помощью options.inputs.source[0].c.


Подробнее здесь: https://stackoverflow.com/questions/782 ... -keyword-a
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»