Python Cerberus: проблема с проверкой различных схем с использованием правила 'anyof_schema' - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь использовать Cerberus для проверки списка, который содержит строки или словари, используя правило anyof_schema, как предложено в этом сообщении :

from cerberus import Validator

A = {'type': 'dict',
     'schema': {'name': {'type': 'string', 'required': True},
                'run': {'type': 'string', 'required': True}}}
B = {'type': 'string', 'empty': False}

schema = {
    'some_field': {
        'type': 'list',
        'anyof_schema': [A, B]
    }
}

v = Validator(schema)

challenge = {
    'some_field': ['simple string 1', {'name': 'some name', 'run': 'some command'}]
}

print(v.validate(challenge))
print(v.errors)

Но проверка не удалась, выведите:

False
{'some_field': ['no definitions validate', {'anyof definition 0': [{0: ['must be of dict type']}], 'anyof definition 1': [{1: ['must be of string type']}]}]}

Кажется, что правило anyof_schema работает, только если все схемы в предоставленном наборе описывают один и тот же тип данных (например, словари).

Почему в моем случае не работает правило anyof_schema и как я могу решить эту проблему?

Я использую Python 3.5.3 и Cerberus 1.3.1

1 Ответ

0 голосов
/ 02 июня 2019

Дело в том, что ваша схема выглядит развернутой так:

{"some_field": {
    "anyof" : [
        {"schema": …},
        {"schema": …},
    ]
}}

, что означает, что весь список проверяется только по одному из вариантов в наборе правил, содержащихся в anyof .

Таким образом, вам просто нужно поменять anyof и schema в вашей иерархии:

{"some_field": {
    "schema" : {
        "anyof":[
            {"type": "dict", …},
            {"type": "str", …},
        ]
    }
}}

Это проверяет каждый элемент списка на предмет разрешенных вариантови поэтому они могут иметь различную «форму».

...