Нормализация вложенных данных при проверке данных в Цербере

Ситуация

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

Однако у меня возникли проблемы с этим. Вот некоторые примеры данных и пример схемы.

data = {
'data': {
    'some_bool': True,
    'some_string': 'some_string',
    'some_int': 0,
    'some_dict_with_some_unexpected_keys': {
        'expected_key1': 'Thing1',
        'expected_key2': 'path_to_thing',
        'unexpected_key1': 'Surprise!'
    }
}
}

example_schema = {
'data': {
    'type': 'dict',
    'schema': {},
    'allow_unknown': {
        'anyof': [
            {'type': 'string'},
            {'type': 'float'},
            {'type': 'integer'},
            {'type': 'boolean'},
            {'type': 'dict',
             'allow_unknown': False,
             'schema': {
                'expected_key1': {
                    'type': 'string',
                    'required': True
                },
                'expected_key2': {
                    'type': 'string',
                    'required': True
                }
             }
            }
        ]
    }
}
}

v = Validator()
v.schema = example_schema
print v.validate(data)
print v.normalized(data)

Очевидно, данные этого примера не будут проверены из-за наличия неожиданного ключа, который я хотел бы удалить. Когда я удаляю это вручную, это проверяет. Я попытался использовать purge_unknown, но он, кажется, не распознается как действительный ключ в схеме. Кроме того, v.normalized, кажется, возвращает оригинальный dict, все еще содержащий неожиданный ключ.

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

Тем не менее, это убирает всю мою структуру данных, так как v.document_error_tree начинается с

{'data': [ValidationError @ 0x7f593f88c690 ( document_path=('data',)....

Я посмотрю на доработку этого решения, чтобы соответствовать моему случаю, но наверняка должен быть более легкий путь!

Короче

Каков наилучший способ очистки неизвестного ключа (ей) с помощью Цербера?

* Извините за испорченный отступ, блок кода stackru ненавидит меня.

0 ответов

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