библиотека attrs и супер - PullRequest
       42

библиотека attrs и супер

0 голосов
/ 26 октября 2019

Вот игрушечный пример класса, который я хочу изменить. На самом деле у меня гораздо больше параметров / атрибутов, таких как импульс, поэтому много повторений кода:

class TransformBl(tf.keras.Model):
    def __init__(self, 
                 features,
                 momentum=0.1,
                 **kwargs):        
        super(TransformBl, self).__init__(**kwargs)
        self.features = features
        self.momentum = momentum
        self.transform = tf.keras.layers.Dense(self.features, use_bias=False)

    def call(self, inputs, training=None):
        x = self.transform(inputs)
        return x

Я начал искать решение, чтобы избежать повторения, и библиотека attrs кажется подходящей. Нет проблем с features, momentum и наследованием. К сожалению, я не могу найти пример с такой конструкцией, как super(TransformBl, self).__init__(**kwargs) в __init__ Я пробовал только с super(), но я получил RuntimeError: super(): no arguments

Есть ли способ переписать этот класс вattrs стиль?

1 Ответ

1 голос
/ 27 октября 2019

Боюсь, вы не сможете использовать ни attrs, ни классы данных, которые были упомянуты по непонятной причине. Не позволяйте вашему __init__ принимать **kwargs, но, что более важно, ни один не позволит вам запустить super().__init__() перед установкой атрибутов этого экземпляра, потому что оба имеют концепцию post -init hook.

И попытка использовать это даст вам ошибку времени выполнения, потому что Модель перехватывает __setattr__:

RuntimeError: It looks like you are subclassing `Model` and you forgot to call `super(YourClass, self).__init__()`. Always start with this line.

attrs может увеличить поддержку того, что вы хотите, написав отдельный метод __attrs_init__, которыйВы можете позвонить себе по номеру __init__, после запуска необходимого супер: https://github.com/python-attrs/attrs/issues/393

Не существует неизбежной временной шкалы, но подобные проблемы подтверждают это.

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

...