0

我有两个 attrs 类,其中一个是另一个的属性。我想确保如果给一个特定的值,那么另一个有一个特定的值。

我看过验证器,认为没有任何东西可以捕捉到这一点。

这是我写的:

@attr.s
class C:
    a = attr.ib(validator=attr.validators.instance_of(str))

@attr.s
class D:
    x = attr.ib(validator=attr.validators.instance_of(str))
    z = attr.ib(validator=attr.validators.instance_of(C))

    def __attrs_post_init__(self):
        if self.x == "a":
            assert self.z.a == "a12"
        elif self.x == "b":
            assert self.z.a == "b12"
        elif self.x == "c":
            assert self.z.a == "c12"


d = D(x="a", z=C("a12"))

我认为这行得通,但我觉得我可能遗漏了一些明显的东西。

4

1 回答 1

2

您的方法很好,除了您可能不应该assert在生产代码中使用(它们在您运行时得到优化python -O)。

如果z 出现在x之后,您还可以使用装饰器验证器来获取部分初始化的实例作为参数,但我发现您的解决方案更健壮,因为它不依赖于属性定义的顺序。

于 2021-07-27T10:02:25.613 回答