Динамически добавлять поля в объекты класса данных - PullRequest
0 голосов
/ 27 сентября 2018

Я пишу библиотеку для доступа к REST API.Возвращает json с объектом пользователя.Я конвертирую его в dict, а затем конвертирую в объект класса данных.Проблема в том, что не все поля являются фиксированными.Я хочу динамически добавлять дополнительные поля (которые не указаны в моем классе данных).Я могу просто присвоить значения моему объекту, но они не появляются в представлении объекта, и функция dataclasses.asdict не добавляет их в результирующий dict:

from dataclasses import asdict, dataclass

@dataclass
class X:
    i: int

x = X(i=42)
x.s = 'text'

x
# X(i=42)

x.s
# 'text'

asdict(x)
# {'i': 42}

1 Ответ

0 голосов
/ 27 сентября 2018

Вы можете использовать make_dataclass для создания X на лету:

X = make_dataclass('X', [('i', int), ('s', str)])
x = X(i=42, s='text')

asdict(x)
# {'i': 42, 's': 'text'}

Или как производный класс:

@dataclass
class X:
    i: int

x = X(i=42)
x.__class__ = make_dataclass('Y', fields=[('s', str)], bases=(X,))
x.s = 'text'

asdict(x)
# {'i': 42, 's': 'text'}
...