假设我们有一个attrs
类:
@attr.s()
class Foo:
a: bool = attr.ib(default=False)
b: int = attr.ib(default=5)
@b.validator
def _check_b(self, attribute, value):
if not self.a:
raise ValueError("to define 'b', 'a' must be True")
if value < 0:
raise ValueError("'b' has to be a positive integer")
所以以下行为是正确的:
>>> Foo(a=True, b=10)
Foo(a=True, b=10)
>>> Foo(b=10)
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<attrs generated init __main__.Foo>", line 5, in __init__
__attr_validator_b(self, __attr_b, self.b)
File "<input>", line 9, in _check_b
ValueError: to define 'b', 'a' must be True
但这不是:
>>> Foo()
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<attrs generated init __main__.Foo>", line 5, in __init__
__attr_validator_b(self, __attr_b, self.b)
File "<input>", line 9, in _check_b
ValueError: to define 'b', 'a' must be True
这显然会发生,因为Foo.b
无论何时Foo.a
给定值,总是被初始化:通过默认值或 on Foo.__init__
。
无论如何,是否可以使用任何初始化挂钩来完成此属性依赖?