在Cerberus中验证数据时标准化嵌套数据

时间:2018-07-26 13:18:02

标签: python validation cerberus

情况

使用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似乎会返回原始字典,但仍包含意外的密钥。

我尝试了FunkyFuture在这里提到的解决方案:How can I remove the fields from a document that failed validation with Cerberus?

但是,它会破坏我的整个数据结构,因为v.document_error_tree以

开头

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

我将研究重新设计该解决方案以适合我的情况,但是肯定有一种更简单的方法!

简而言之

使用Cerberus清除未知密钥的最佳方法是什么?

*对不起缩进,对不起,stackoverflow代码块讨厌我。

0 个答案:

没有答案