Схема Cerberus с одним словарем или списком словарей

Я пытаюсь построить схему, в которой оператор может быть одним словарем или списком словарей. Бывший:

{'Document': {'key': 'value'}}

Или несколько ключей:

{'Document': [ {'key1': 'value1'}, {'key2': 'value2'}, {'key3': 'value3'}]}

Следуя документации, которую я тестировал с этой схемой:

v.schema = {'Document': {'type': ['dict', 'list'], 'schema': {'type': 'dict'}}}

Вот результат:

>>> v.schema = {'Document': {'type': ['dict', 'list'], 'schema': {'type': 'dict'}}}
>>> v.validate({'Document': [{'key1': 'value1'}, {'key2': 'value2'}, {'key3': 'value3'}]})
True
>>> v.validate({'Document': {'key': 'value'} })
False
>>> v.errors
{'Document': ['must be of dict type']}

Тестовый код:

import cerberus

if __name__ == '__main__':
    v = cerberus.Validator()
    v.schema = {'Document': {'type': ['dict', 'list'], 'schema': {'type': 'dict'}}}
    print(v.validate({'Document': [{'key1': 'value1'}, {'key2': 'value2'}, {'key3': 'value3'}]}))
    print(v.validate({'Document': {'key': 'value'}}))
    print(v.errors)

Во втором случае значение является типом dict, но я получаю эту ошибку вместо того, чтобы правильно интерпретировать схему.


person Rafael Koike    schedule 12.05.2021    source источник
comment
Можете ли вы расширить фрагмент кода и показать, как вы определили «v»?   -  person DSteman    schedule 12.05.2021
comment
Обновлен вопрос с полным тестовым кодом   -  person Rafael Koike    schedule 12.05.2021


Ответы (1)


Я думаю, что проблема связана с правилом схемы и отображением, если вы удалите правило схемы, оно должно работать следующим образом:

import cerberus

if __name__ == '__main__':
    v = cerberus.Validator()
    v.schema = {'Document': {'type': ['dict', 'list']}}
    print(v.validate({'Document': [{'key1': 'value1'}, {'key2': 'value2'}, {'key3': 'value3'}]}))
    print(v.validate({'Document': {'key': 'value'}}))
    print(v.errors)

Дополнительная информация о правиле схемы и отображении:

https://docs.python-cerberus.org/en/stable/validation-rules.html#schema-dict

person Jayvee    schedule 12.05.2021
comment
Привет, Джейви. Хитрость в том, что я хочу применить схему и к словарю. Итак, решение, которое вы предлагаете, работает, но просто не проверяйте, что в dict есть схема, которую я хочу применить. - person Rafael Koike; 12.05.2021