从文档中,我不清楚自定义规则和自定义验证器的用例有何不同.在文档中给出的示例中,唯一的区别是一个额外的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)
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(在文档中为字段名称)value和error(提交错误的方法)作为参数。
自定义规则只能在Validator子类中定义。与将validator可验证的可调用项定义为约束的规则相反,对于自定义规则,可以在架构中定义约束,该约束也将传递给自定义规则实现(在此答案的示例中为other)。因此,可以在架构中控制规则的行为。
该validator规则的文档似乎很容易引起误解,即使不是很明显的错误,我也应该尽快对其进行修复!感谢您的举报。
| 归档时间: |
|
| 查看次数: |
1220 次 |
| 最近记录: |