Python: Принуждение значения Cerberus, если len (value) == 1 - PullRequest
0 голосов
/ 07 мая 2020

Используя библиотеку cerberus для проверки, мне интересно, как может выглядеть настраиваемое правило, которое проверяет, является ли ввод списком только с ОДНИМ элементом. В этом случае значение должно быть изменено на одно значение (Value Coercion).

Вот моя попытка, которая не работает.

from cerberus import Validator


class MyValidator(Validator):
    def _validate_is_one_elem_list(self, is_one_elem_list, field, value):
        """{'type': 'boolean'}"""

        if is_one_elem_list and isinstance(value, list) and len(value) == 1:
            self.value = value[0]  # self.value doesn't exist, so that's wrong. How to do better?


v = MyValidator()

schema = {"amount": {"is_one_elem_list": True, "type": "list"}}
print(v.validated({"amount": [10]}, schema))

Результат: {'amount': [10]}.
Однако должно читаться {'amount': 10}

1 Ответ

0 голосов
/ 11 мая 2020

Замените self.value = value[0] на self.document[field] = value[0].

Настройка метода с использованием функции check_with (https://docs.python-cerberus.org/en/stable/validation-rules.html#check -с ) еще больше упрощает все это.

from cerberus import Validator


class MyValidator(Validator):
    def _check_with_is_one_elem_list(self, field, value):

        if isinstance(value, list) and len(value) == 1:
            self.document[field] = value[0]


v = MyValidator()

schema = {"amount": {"check_with": "is_one_elem_list", "type": "list"}}
assert v.validated({"amount": [10]}, schema) == {"amount": 10}
...