带有附加参数的python-attrs中的自定义验证器

时间:2018-08-22 17:27:20

标签: python python-3.x python-attrs

我使用attrs定义了几个这样的类:

from attr import attrs, attrib, validators

@attrs
class MyClass:
    name = attrib(])
    @name.validator
    def check_length(self, attribute, value):
        if not (3 <= len(value) <= 30):
            raise ValueError("Name must be between 3 and 30 characters")

    description = attrib()
    @description.validator
    def check_length(self, attribute, value):
        if not (10 <= len(value) <= 400):
            raise ValueError("Description must be between 10 and 400 characters")

对于几个属性,我需要创建一个验证器以检查数据是否在一定范围内。我想避免重复,因此我可以创建一个自定义验证器,在其中为min和max传递一些额外的参数,例如:

def range_validator(instance, attribute, value, min_value, max_value):
    if  min_value >= len(value) >= max_value:
        raise ValueError("Must be between {} and {}".format(min_value, max_value))

但是然后我不知道如何从attrib()内部调用此验证器,并传递额外的args(min_value和max_value),我的意思是做类似的事情:

name = attrib(validator=[range_validator(self, 10, 30)])

1 个答案:

答案 0 :(得分:1)

您可以使用<i [attr.fa]="item.icon"></i>

functools.partial

或者,您也可以使用闭包:

def range_validator(instance, attribute, value, min_value, max_value):
    lv = len(value)
    if min_value > lv or lv > max_value:
        raise ValueError("Must be between {} and {}".format(min_value, max_value))

@attrs
class C:
    x = attrib(validator=partial(range_validator, min_value=10, max_value=30))

我个人更喜欢封闭工厂方法,因为它们对您的工作更加明确。局部对象总是对我有点特别,但这可能只是我。

(请注意,我冒昧地修复了验证器中的逻辑错误-您可能也要应用它。:))