Как определить схему, чтобы список не был пустым?

В фреймворке REST API python-eve я определяю список в ресурсе, тип элемента списка — dict. И я не хочу, чтобы список был пуст. Итак, как определить схему?

{
    'parents' : {
        'type' : 'list',
        'schema' : {
            'parent' : 'string'
        }
    }
}

person user3583796    schedule 16.05.2014    source источник


Ответы (2)


В настоящее время правило проверки empty доступно только для строковых типов, но вы можете создать подкласс стандартного валидатора, чтобы он мог обрабатывать списки:

from eve.io.mongo import Validator

class MyValidator(Validator):
    def _validate_empty(self, empty, field, value):
        # let the standard validation happen
        super(Validator, self)._validate_empty(empty, field, value)
        # add your custom list validation
        if isinstance(value, list) and len(value) == 0 and not empty:
            self._error(field, "list cannot be empty")

или, если вы хотите вместо этого предоставить стандартное сообщение об ошибке empty:

from eve.io.mongo import Validator
from cerberus import errors

class MyValidator(Validator):
    def _validate_empty(self, empty, field, value):
        # let the standard validation happen
        super(Validator, self)._validate_empty(empty, field, value)
        # add your custom list validation
        if isinstance(value, list) and len(value) == 0 and not empty:
            self._error(field, errors.ERROR_EMPTY_NOT_ALLOWED)

Затем вы запускаете свой API следующим образом:

app = Eve(validator=MyValidator)
app.run()

PS: я планирую добавить списки и словари в правило empty Цербера когда-нибудь в будущем.

person Nicola Iarocci    schedule 17.05.2014
comment
Спасибо за ответ. - person user3583796; 17.05.2014

Нет встроенного способа сделать это. Однако вы можете определить класс-оболочку для своего списка:

class ListWrapper(list):
    # Constructor
    __init__(self, **kwargs):
        allIsGood = False
        # 'kwargs' is a dict with all your 'argument=value' pairs
        # Check if all arguments are given & set allIsGood
        if not allIsGood:
            raise ValueError("ListWrapper doesn't match schema!")
        else:
            # Call the list's constructor, i.e. the super constructor
            super(ListWrapper, self).__init__()

            # Manipulate 'self' as you please

Используйте ListWrapper везде, где вам нужен непустой список. Вы можете каким-то образом внедрить определение схемы, если хотите, и добавить его в качестве входных данных для конструктора.

Также: вы можете взглянуть на это

person Tejas Pendse    schedule 16.05.2014
comment
Вы хотите определить собственные правила проверки, такие как python-eve.org/validation. html#пользовательские правила проверки - person user3583796; 16.05.2014
comment
Нет, потому что я не хотел использовать внешние пакеты. Вы можете добавить Validator для проверки ваших полей, если вы используете eve. - person Tejas Pendse; 16.05.2014