0

我一直在通过以下方式使用 attrs:

@attr.mutable
class Foo:
    x: int = attr.ib(validator=attr.validators.instance_of(int))


@attr.mutable
class Bar:
    x: int = attr.ib(validator=attr.validators.instance_of(int))
    foo: Foo = attr.ib(
        default=attr.Factory(factory=lambda self: Foo(self.x), takes_self=True),
        validator=attr.validators.instance_of(Foo),
    )
if __name__ == "__main__":
    Bar("5")

当我运行代码时,我显然得到了一个错误。

但是,对我来说不直观的部分是Foo该类的验证器引发了错误。

我可能是错的,但据此我假设x属性的验证器Bar出现在Foo's 之后。

这是为什么?Bar在将' 的x属性作为参数传递给Foo' 的 init 方法之前验证它不是更有意义吗?

提前致谢!

4

1 回答 1

0

实例化时,在验证器运行之前填充默认值。

该方法对具有验证器并且不知道尚未完全实例化自身__init__的事实一无所知。FooFooBar

从 的角度来看Bar,它调用了价值x尚未验证的工厂("5")。

从 的角度来看Foo,它使用 str 实例化并且验证失败。

于 2021-08-27T09:12:28.747 回答