当属性是另一个 attrs 对象时进行 attrs 验证检查
Attrs validation checking when an attribute is another attrs object
我有两个属性 类,其中一个是另一个的属性。我想确保如果给一个特定的值,另一个就会有一个特定的值。
我查看了验证器,认为没有任何东西可以捕捉到这一点。
这是我写的:
@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"))
我认为这可行,但我感觉我可能遗漏了一些明显的东西。
您的方法很好,除了您可能不应该在生产代码中使用 assert
(当您 运行 python -O
时它们会被优化掉)。
如果 z 出现在x 之后,您还可以使用decorator validator 获取部分初始化的实例作为参数,但我发现您的解决方案更可靠,因为它不依赖于属性定义的顺序。
我有两个属性 类,其中一个是另一个的属性。我想确保如果给一个特定的值,另一个就会有一个特定的值。
我查看了验证器,认为没有任何东西可以捕捉到这一点。
这是我写的:
@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"))
我认为这可行,但我感觉我可能遗漏了一些明显的东西。
您的方法很好,除了您可能不应该在生产代码中使用 assert
(当您 运行 python -O
时它们会被优化掉)。
如果 z 出现在x 之后,您还可以使用decorator validator 获取部分初始化的实例作为参数,但我发现您的解决方案更可靠,因为它不依赖于属性定义的顺序。