8

文档中,我不清楚自定义规则和自定义验证器的用例有什么区别。在文档中给出的示例中,唯一的区别是在自定义规则if中检查值的额外语句。is_odd我什么时候应该更喜欢自定义规则,什么时候应该更喜欢自定义验证器?


自定义规则

schema = {'amount': {'isodd': True, 'type': 'integer'}}
from cerberus import Validator

class MyValidator(Validator):
    def _validate_isodd(self, isodd, field, value):
        """ Test the oddity of a value.

        The rule's arguments are validated against this schema:
        {'type': 'boolean'}
        """
        if isodd and not bool(value & 1):
            self._error(field, "Must be an odd number")

自定义验证器

from cerberus import Validator
schema = {'amount': {'validator': 'oddity'}}

class AValidator(Validator):
    def _validator_oddity(self, field, value):
       if value & 1:
           self._error(field, "Must be an odd number")
4

1 回答 1

7

validator当您想将某个字段的值的验证委托给自定义函数或方法(后者是架构中的字符串引用)时,您可以使用该规则,如下所示:

>>> def oddity(field, value, error):
...   if not value & 1:
...     error(field, "Must be an odd number")

>>> schema = {'amount': {'validator': oddity}}
>>> v = Validator(schema)
>>> v.validate({'amount': 10})
False

>>> v.errors
{'amount': 'Must be an odd number'}

>>> v.validate({'amount': 9})
True

请注意,它们的签名是固定的,它们完全采用field(文档中的字段名称)valueerror(提交错误的方法)作为参数。

自定义规则只能在Validator子类中定义。与将验证可调用定义为约束的规则相反validator,对于自定义规则,约束可以在也传递给自定义规则实现的模式中定义(在此答案的示例中,它被命名为other)。因此,可以在模式中控制规则的行为。

看来该validator规则的文档即使不是完全错误也具有误导性,我应该尽快修复它!感谢您的报告。

于 2016-09-12T14:23:02.510 回答