2

我正在使用开源 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'}
4

3 回答 3

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'}

它还考虑了子文档中的错误。

于 2017-10-24T12:09:23.493 回答
1

编码:

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

产生这个输出:

{'name': 'john doe'}
于 2017-10-23T16:25:32.550 回答
0

你考虑过这个purge_unknown选项吗?

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

在上面的例子中,bar它是未知的,因此它被清除了。请注意,我们在normalized这里使用,请参阅文档

于 2017-10-23T16:32:10.867 回答