Цербер принимает в качестве действительного пустые значения

Пытаясь получить эту проверку как приемлемую Trueгде любое из полей может быть empty: True (по умолчанию я знаю), но когда не пусто, то должны применяться все последовательные условия.

SCHEMA v = Validator()

schm = {'l_addrsch': {'type': 'string', 'empty': True, 'allowed': ['m', 'o', 'e', 'M', 'O', 'E'], 'dependencies': ['l_nrefaddr', 'l_refaddr']},
    'l_nrefaddr': {'type': 'integer', 'empty': True, 'dependencies': ['l_addrsch', 'l_refaddr']},
    'l_refaddr': {'type': 'integer', 'empty': True, 'dependencies': ['l_addrsch', 'l_nrefaddr']}}

СООБЩЕНИЕ val = v.validate(p, schema)

{ 
"l_addrsch" : "",
"l_nrefaddr" : "",
"l_refaddr" :  ""
}

ОТВЕТ

    [
    {
        "l_addrsch": [
            "unallowed value "
        ],
        "l_nrefaddr": [
            "must be of integer type"
        ],
        "l_refaddr": [
            "must be of integer type"
        ]
    }
]

Надеюсь, я не слишком запутался.

РЕДАКТИРОВАТЬ 1: попытался это, как указано в нормализации правил по умолчанию:

schema = {'l_addrsch': {'type': 'string', 'default': '', 'allowed': ['', 'm', 'o', 'e', 'M', 'O', 'E'], 'dependencies': ['l_nrefaddr', 'l_refaddr']},
                'l_nrefaddr': {'type': 'integer', 'default': 0, 'dependencies': ['l_addrsch', 'l_refaddr']},
                'l_refaddr': {'type': 'integer', 'default': 0, 'dependencies': ['l_addrsch', 'l_nrefaddr']}

СООБЩЕНИЕ:

   { "l_addrsch" : "",
    "l_nrefaddr" : "",
    "l_refaddr" :  ""}

Но кажется, что я все еще что-то упустил, чтобы заставить его работать на целые числа

[
    {
        "l_nrefaddr": [
            "must be of integer type"
        ],
        "l_refaddr": [
            "must be of integer type"
        ]
    }
]

2 ответа

Из документа:

Если False, проверка итерируемого значения завершится неудачно, если оно пустое. Установка его в True вручную не имеет смысла, так как ведет себя так, как если бы оно вообще не использовалось.

Чтобы установить значения по умолчанию, используйте вместо этого правило нормализации. http://docs.python-cerberus.org/en/stable/normalization-rules.html

Что-то вроде этого:

'kind': {'type': 'string', 'default': ''}

Проверка не проходит по двум причинам:

  1. '' не определяется как allowed значение, этот набор правил должен достичь того, что вы хотите для l_addrsch поле:

    'l_addrsch': {'type': string, 'allowed': ('', 'm', 'o', 'e', 'M', 'O', 'E'), 'required': True}

    Обновление: в Cerberus 1.2 будет возможно иметь пустое поле (если разрешено), которое не будет проверяться на допустимые значения (см. Этот коммит).

  2. Как строка ('') передается в качестве значения для двух других полей, оно, конечно, потерпит неудачу с type ограничен integer, Вы должны добавить приведение входного значения, если '' всегда значит 0,

Другие вопросы по тегам