Как я могу удалить поля из документа, который не прошел проверку с помощью 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
здесь, см. документы.