首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有额外参数的python-attrs中的自定义验证器

带有额外参数的python-attrs中的自定义验证器
EN

Stack Overflow用户
提问于 2018-08-23 01:27:20
回答 1查看 1.1K关注 0票数 2

我有几个使用attrs定义的类,如下所示:

代码语言:javascript
复制
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参数,如下所示:

代码语言:javascript
复制
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),我的意思是这样做:

代码语言:javascript
复制
name = attrib(validator=[range_validator(self, 10, 30)])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-23 18:49:20

您可以使用functools.partial

代码语言:javascript
复制
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))

或者,您可以使用闭包:

代码语言:javascript
复制
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))

我个人更喜欢闭包工厂的方法,因为它们更清楚你在做什么。对我来说,偏音总是觉得有点特别,但那可能就是我。

(请注意,我擅自修复了您的验证器中的一个逻辑错误--您可能也想应用它。:)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51972203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档