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

dar*_*ith 8 python cerberus

文档中,我不清楚自定义规则和自定义验证器的用例有何不同.在文档中给出的示例中,唯一的区别是一个额外的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")
Run Code Online (Sandbox Code Playgroud)

自定义验证器

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")
Run Code Online (Sandbox Code Playgroud)

Nic*_*cci 5

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
Run Code Online (Sandbox Code Playgroud)

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

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

validator规则的文档似乎很容易引起误解,即使不是很明显的错误,我也应该尽快对其进行修复!感谢您的举报。