Я строю библиотеку для чтения из ввода и собираю библиотеки довольно высокого уровня для сериализации / десериализации. Входные данные будут хорошо структурированы, но могут изменяться и / или настраиваться, поэтому предварительная сборка всех типов классов невозможна. Ниже приведен пример кода:
import dataclasses
from dataclasses import make_dataclass
# I'm including the yaml_string below as an example of the input.
yaml_string = """
data_store: 'foo'
storage_connection_type: 'bar'
connection:
endpoint: 'qaz'
access_key_id: 'qoo'
"""
top_node = make_dataclass('Top node', ['data_store', 'storage_connection_type', 'connection'])
nested_node = make_dataclass('Nested node', ['endpoint', 'access_key_id'])
n = nested_node('qaz', 'qoo')
t = top_node('foo', 'bar', n)
print(t.data_store) #=> foo
print(t.connection.endpoint) #=> qaz
Последние шаги - это то, что я хочу выполнить - использование точечной нотации, позволяющей высокоуровневому пользователю читать / писать в классы, чрезвычайно мощно.
К сожалению, приведенный выше код является болезненным - это означает, что я должен поддерживать каталог созданных классов - что, как правило, хорошо, но когда вы начинаете проникать во вложенные объекты, это выглядит ужасно.
Я переборщил с классами данных? Есть ли способ лучше? Я посмотрел на __slots__
и namedtuples
, и у обоих, похоже, есть похожие проблемы.