Python Cerberus: проблема с проверкой различных схем с использованием правила anyof_schema

Я пытаюсь использовать 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.


person desergik    schedule 23.05.2019    source источник


Ответы (1)


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

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

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

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

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

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

person funky-future    schedule 02.06.2019