Сообщить об ошибке.

Функция make_dataclass() модуля dataclasses в Python

Создание классов данных "на лету"

Синтаксис:

import dataclasses

dataclasses.make_dataclass(cls_name, fields, *, bases=(), 
                           namespace=None, init=True, 
                           repr=True, eq=True, order=False, 
                           unsafe_hash=False, frozen=False)

Параметры:

  • cls_name - имя класса данных,
  • fields - атрибуты класса данных,
  • bases=() - базовые классы,
  • namespace=None - пространство имен,
  • init=True - флаг для создания метода __init__(),
  • repr=True - флаг для создания метода __repr__(),
  • eq=True - флаг для создания метода __eq__(),
  • order=False - флаг для создания методов сравнения класса,
  • unsafe_hash=False - флаг для создания метода __hash__(),
  • frozen=False - флаг для создания неизменяемого типа.

Возвращаемое значение:

  • новый класс данных.

Описание:

Функция make_dataclass() модуля dataclasses создает новый класс данных с именем cls_name; полями, как определено аргументом fields; базовыми классами, как указано в bases, и инициализируется пространством имен, как указано в namespace.

Аргумент fields является итерируемым, каждый из элементов которого представляет собой: name или (name, type) или (имя, тип, поле).

Если указано только имя name, то для его типа используется аннотация typing.Any.

Значения init, repr, eq, order, unsafe_hash и frozen имеют то же значение, что и для декоратора @dataclass().

Эта функция не является строго обязательной, поскольку любой механизм Python для создания нового класса с __annotations__ может затем применить функцию-декоратор dataclasses.dataclass() для преобразования этого класса в класс данных. Эта функция предоставляется для удобства.

Пример создания класса данных "на лету".

C = make_dataclass('C',
                   [('x', int),
                     'y',
                    ('z', int, field(default=5))],
                   namespace={'add_one': lambda self: self.x + 1})

Эквивалентно:

@dataclass
class C:
    x: int
    y: 'typing.Any'
    z: int = 5

    def add_one(self):
        return self.x + 1