Я надеюсь, что это отвечает на ваш вопрос, так как я не совсем уверен, что я правильно понял.Это немного похоже на обходной путь, но это также будет делать то, что вы хотите.Похоже, вы хотите повторно использовать набор требований в нескольких местах.Лучший вариант, который я вижу для этого, - это создать собственный подкласс Validator и добавить собственный метод проверки для обработки общих наборов правил.Приведенный ниже код должен работать в приведенном вами примере.
from cerberus import Validator
import yaml
class MyValidator(Validator):
def _validator_required_string(self, field, value):
# Check the type
if type(value) != str:
self._error(field, "Must be of type 'str'")
# Check the length
if len(value) == 0:
self._error(field, "Cannot be blank")
data = {"signin": { "name": "myusername",
"password": "mypassword"}}
schema = '''
signin:
type: dict
empty: False
nullable: False
schema:
name:
validator: required_string
password:
validator: required_string
'''
v = MyValidator(yaml.load(schema))
Вы можете ознакомиться с документацией Custom Validators здесь, чтобы понять требования к именованию.В качестве примечания: если вы можете определить свою схему в коде Python вместо YAML, вы можете определить переменную required_string
, которая содержит словарь фактических правил, которые вы хотите использовать, и затем ссылаться на эту переменную в более крупных определениях схемы.Это позволит вам использовать фактические правила вместо того, чтобы определять функцию для реализации правил.