Convert dict to dataclass or namedtuple

Распаковка словаря для создания экземпляра

>>> from dataclasses import dataclass
>>> @dataclass
... class MyData:
...   prop1: int
...   prop2: str
...   prop3: int
...
>>> d = {'prop1': 5, 'prop2': 'hi', 'prop3': 100}
>>> my_data = MyData(**d)
>>> my_data
MyData(prop1=5, prop2='hi', prop3=100)

Тоже самое можно сделать с namedtuple

>>> from collections import namedtuple
>>> MyTuple = namedtuple('MyTuple', 'field1, field2, field3')
>>> d = {'field1': 5, 'field2': 'hi', 'field3': 100}
>>> my_tuple = MyTuple(**d)
>>> my_tuple
MyTuple(field1=5, field2='hi', field3=100)

Через annotation

Можно воспользоваться этим:

class Foo:
    foo: str
    bar: int
    baz: list

Foo.__annotations__ = {'foo': str, 'bar': int, 'baz': list}

Тогда так:

d_dataclass = dataclass(type('d_dataclass', (), {'__annotations__': {k: type(v) for k, v in d.items()}}))

Наконец можно так:

def make_dc(d, name='d_dataclass'):
    @dataclass
    class Wrapped:
        __annotations__ = {k: type(v) for k, v in d.items()}
        
    Wrapped.__qualname__ = Wrapped.__name__ = name

    return Wrapped

Источник

Создание инстанса с помощью dacite

Библиотека dacite

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)

[python-standart-library]

>>> На главную