python-attrs 中带有额外参数的自定义验证器
Custom validator in python-attrs with extra parameters
我有几个 类 定义使用像这样的属性:
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")
对于几个属性,我需要创建一个验证器来检查数据是否在某个范围内。我想避免重复,所以我可以创建一个自定义验证器,在其中传递一些额外的最小值和最大值参数,例如:
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() 内部调用这个验证器来传递额外的参数(min_value 和 max_value),我的意思是做类似的事情:
name = attrib(validator=[range_validator(self, 10, 30)])
您可以使用 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))
或者你可以使用闭包:
def make_range_validator(min_value, max_value):
def range_validator(instance, attribute, value):
lv = len(value)
if min_value > lv or lv > max_value:
raise ValueError("Must be between {} and {}".format(min_value, max_value))
return range_validator
@attrs
class C:
x = attrib(validator=make_range_validator(10, 30))
我个人更喜欢闭包工厂方法,因为它们更明确地说明你在做什么。部分对我来说总是感觉有点特别,但这可能只是我。
(请注意,我冒昧地修复了您验证器中的一个逻辑错误——您可能也想应用它。:))
我有几个 类 定义使用像这样的属性:
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")
对于几个属性,我需要创建一个验证器来检查数据是否在某个范围内。我想避免重复,所以我可以创建一个自定义验证器,在其中传递一些额外的最小值和最大值参数,例如:
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() 内部调用这个验证器来传递额外的参数(min_value 和 max_value),我的意思是做类似的事情:
name = attrib(validator=[range_validator(self, 10, 30)])
您可以使用 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))
或者你可以使用闭包:
def make_range_validator(min_value, max_value):
def range_validator(instance, attribute, value):
lv = len(value)
if min_value > lv or lv > max_value:
raise ValueError("Must be between {} and {}".format(min_value, max_value))
return range_validator
@attrs
class C:
x = attrib(validator=make_range_validator(10, 30))
我个人更喜欢闭包工厂方法,因为它们更明确地说明你在做什么。部分对我来说总是感觉有点特别,但这可能只是我。
(请注意,我冒昧地修复了您验证器中的一个逻辑错误——您可能也想应用它。:))