Python 如何从Cerberus验证失败的文档中删除字段?

Python 如何从Cerberus验证失败的文档中删除字段?,python,cerberus,Python,Cerberus,我正在使用开源Python数据验证库来验证字典的结构。我希望它获取一个部分无效的文档,并在没有无效密钥的情况下输出它 例如,对于此脚本: from cerberus import Validator schema = {'name': {'type': 'string'}, 'user_id': {'type': 'integer'}} document = {'name': 'john doe', 'user_id': 'fdfdfd'} v = Validator(s

我正在使用开源Python数据验证库来验证字典的结构。我希望它获取一个部分无效的文档,并在没有无效密钥的情况下输出它

例如,对于此脚本:

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'}
代码:

validDoc = {}
for key in document:
    if key not in v.errors:
        validDoc[key] = document[key]
print(validDoc)
生成此输出:

{'name': 'john doe'}

您是否考虑过
purge\u unknown
选项

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

在上面的示例中,
bar
是未知的,因此它被清除。请注意,我们在这里使用的是
规范化的
,请参阅。

这是一个比@jdoe更安全的解决方案,因为
Validator.errors属性的结构不一定与文档的结构相关。但是
文档错误树
提供了这样的功能

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

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

请添加当前输出。v.validate(document)的输出为“True”。v.document属性包含
{name':'john doe','errokey':'fdfdfdfd'}
v.errors属性包含
{'errokey':'必须是整数类型'}
这对我没有帮助,我正在将密钥交给验证器,但它与模式不匹配,所以它不会丢弃它-这是一个已知字段,我希望有“内置”的东西可以做到这一点。如果没有,那就是我要做的。thanksI尝试了此解决方案,但不幸的是,我在错误树中的第
行if字段上遇到错误。子体:
AttributeError:'NoneType'对象没有属性“子体”
。但是
验证程序.文档错误\u树
。有没有办法解决这个问题?我修改了片段中可能需要的行。