Как я могу удалить поля из документа, который не прошел проверку с помощью Cerberus?

Я использую библиотеку проверки достоверности данных Python с открытым исходным кодом Cerberus для проверки структуры словаря. Я хочу, чтобы он взял частично недействительный документ и вывел его без неверных ключей.

Например, для этого скрипта:

from cerberus import Validator

schema = {'name': {'type': 'string'}, 
          'user_id': {'type': 'integer'}}
document = {'name': 'john doe', 'user_id': 'fdfdfd'}
v = Validator(schema)
v.validated(document)

Это возвращает None потому что проверка не удалась.

Есть ли способ получить документ только с проверенными полями, например так:

{'name': 'john doe'}

3 ответа

Это более безопасное решение, чем у @jdoe, потому что структура Validator.errors свойство не обязательно соотносится с документом. Но document_error_tree обеспечивает такое.

def remove_invalid_fields(document, errors_tree):
    if errors_tree is None:
        return document
    filtered = {}
    for field, value in document.items():
        if field in errors_tree.descendants:
            continue
        if isinstance(value, Mapping):
            value = remove_invalid_fields(value, errors_tree[field])
        filtered[field] = value
    return filtered

schema = {'name': {'type': 'string'},
          'user_id': {'type': 'integer'}}
document = {'name': 'john doe', 'user_id': 'fdfdfd'}
validator = Validator(schema)

validator(document)
result = remove_invalid_fields(document, validator.document_error_tree)
assert result == {'name': 'john doe'}

Он также учитывает ошибки в поддокументах.

Код:

validDoc = {}
for key in document:
    if key not in v.errors:
        validDoc[key] = document[key]
print(validDoc)

производит этот вывод:

{'name': 'john doe'}

Рассматривали ли вы purge_unknown вариант?

>>> v = Validator({'foo': {'type': 'string'}}, purge_unknown=True)
>>> v.normalized({'bar': 'foo'})
{}

В приведенном выше примере bar неизвестно, следовательно, оно очищено. Обратите внимание, что мы используем normalized здесь, см. документы.

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