Запускать валидатор атрибута только после окончания __attrs_post_init__

Я имею:

@attr.s
class Example:
    number = attr.ib(validator=attr.validators.instance_of(int), init=False)

    def __attrs_post_init__(self):
        self.number = 'string'
        print('It seems, validation was running before:(')


t = Example()

Как правильно настроить валидацию здесь? Я хочу проверить self.number после создания экземпляра.

1 ответ

Решение

Была небольшая дискуссия, когда мы реализовали __attrs_post_init__ запускать ли валидаторы до или после __init__,

Мы решили раньше, потому что их основной смысл - защищать класс от неправильного создания экземпляров и давать вам уверенность в том, что находится в ваших качествах.


Тем не менее, вы всегда можете запустить валидаторы вручную с помощью attr.validate ():

@attr.s
class Example:
    number = attr.ib(validator=attr.validators.instance_of(int), init=False)

    def __attrs_post_init__(self):
        self.number = 'string'
        # ...
        attr.validate(self)

Мы планируем сделать проверку - и когда она будет проведена - более гибкой, но ничего конкретного из этого не получилось.

Другие вопросы по тегам