python37: @dataset вызывает super .__ init __ (...)? - PullRequest
1 голос
/ 25 марта 2020

Предположим, у меня сложный класс с большим количеством входных данных. Этот класс не является классом данных. Кроме того, если я импортирую это явно, я хотел бы, чтобы он жаловался, если я не предоставляю все аргументы.

Однако для целей сопряжения и чистого кода я хотел бы определить значения по умолчанию для конструкторов и передать аргументы для сложного класса как более или менее «определенный» диктат.

Это хорошая задача для класса данных, и я определил класс класса данных, содержащий все аргументы со значениями по умолчанию, которые я изменяю и манипулирую.

@dataclass
ComplicatedClassArgs:
   arg1: int
   arg2: bool = False
   ...

Мой вопрос сводится к следующему: могу ли я написать следующее и ожидать и / или сказать классу данных, чтобы он вызывал super. init (...) со всеми именованными атрибутами I определили?

@dataclass
ComplicatedClassArgs(ComplicatedClass):
    arg1: int
    arg2: bool = False

    def some_meta_arg_manipulation_function(...):
        pass

    def some_other_arg_related_function(...):
        pass

Так, что я знаю, что сочинил более продвинутое поведение внутреннего класса с точкой входа класса данных?

1 Ответ

0 голосов
/ 25 марта 2020

Возможно, я неправильно понял ваш вариант использования, но мне кажется, что наследование - это не тот инструмент, который нужен для этой работы. Как насчет простого @classmethod?

@dataclass
ComplicatedClassArgs:
    arg1: int
    arg2: bool

    @classmethod
    def from_dict(cls, kwargs=None):
        """"ComplicatedClassArgs factory.

        This method provides sensible default values that 
        may or may not be replaced through the input kwargs. 
        """
        if kwargs is None:
            kwargs = {}
        default_params = {
            'arg1': 1,
            'arg2': False
        }
        return cls(**{**default_params, **kwargs})

>>> ComplicatedClassArgs()
Traceback (most recent call last):
  ...
TypeError: __init__() missing .. required positional arguments
>>> ComplicatedClassArgs.from_dict()
ComplicatedClassArgs(arg1=1, arg2=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...