Cerberus自定义规则和自定义验证器之间有什么区别?

时间:2016-09-11 17:28:59

标签: python cerberus

documentation开始,我不清楚自定义规则和自定义验证器的用例有何不同。在文档中给出的示例中,唯一的区别是额外的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")

1 个答案:

答案 0 :(得分:4)

如果要将某个字段值的验证委托给自定义函数或方法(后者在模式中作为字符串引用),则使用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(提交错误的方法)作为论据。

Custom rules只能在Validator子类中定义。与验证可调用被定义为约束的validator规则相比,自定义规则约束可以在也传递给自定义规则实现的模式中定义(在this answer's example中它名为other)。因此,可以在模式中控制规则的行为。

validator规则的文档似乎有误导性,如果不是完全错误的话,我应该尽快修复它!感谢您的报道。