Python: проверка с использованием cerberus - PullRequest
1 голос
/ 06 мая 2020

Я хотел бы проверить dict, где поле может содержать либо int, либо List[int]. Кроме того, все int должны быть положительными.

Мне нужна помощь с настройкой схемы. Схема ниже не работает должным образом. Они не проверяют отрицательные числа. То есть отрицательные числа проходят проверку, что неверно.

import cerberus

v = cerberus.Validator()

schema1 = {
    "int_or_list_of_int": {
        "type": ["integer", "list"],
        "schema": {"type": "integer", "min": 0},
    },
}

schema2 = {
    "int_or_list_of_int": {
        "type": ["integer", "list"],
        "valuesrules": {"type": "integer", "min": 0},
    },
}

num1 = {"int_or_list_of_int": 5}
num2 = {"int_or_list_of_int": [5, 10]}
num3 = {"int_or_list_of_int": -5}
num4 = {"int_or_list_of_int": [5, -10]}

# schema 1
assert v.validate(num1, schema1)
assert v.validate(num2, schema1)
assert not v.validate(num3, schema1)  # Evaluates to True
assert not v.validate(num3, schema1)  # Evaluates to True

# schema 2
assert v.validate(num1, schema2)
assert v.validate(num2, schema2)to True
assert not v.validate(num3, schema2)  # Evaluates to True
assert not v.validate(num4, schema2)  # Evaluates to True

1 Ответ

3 голосов
/ 06 мая 2020

Прежде всего, schema для int_or_list_of_int должен быть внутри int_or_list_of_int dict. Во-вторых, min следует применять как для целого числа (внутри int_or_list_of_int), так и для списка (внутри schema).

schema = {
    "int_or_list_of_int": {
        "type": ["integer", "list"],
        "min": 0,
        "schema": {"type": "integer", "min": 0}
    }
}
...