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 に答える