Python 如何从Cerberus验证失败的文档中删除字段?
我正在使用开源Python数据验证库来验证字典的结构。我希望它获取一个部分无效的文档,并在没有无效密钥的情况下输出它 例如,对于此脚本: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
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树
。有没有办法解决这个问题?我修改了片段中可能需要的行。