3

我有:

@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 。

4

1 回答 1

10

当我们实现__attrs_post_init__是在之前还是之后运行验证器时,我们进行了一些讨论__init__

我们决定使用before,因为它们存在的主要理由是保护类免受错误的实例化,并让对属性中的内容充满信心。


也就是说,您始终可以使用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)

我们确实 计划使验证(以及何时执行)更加灵活,但还没有具体的结果。

于 2017-10-19T06:22:23.387 回答