在Python中使用cerberus来验证布尔值

时间:2017-01-17 14:16:54

标签: python validation boolean schema cerberus

我试图在Python中使用Cerberus来验证一些数据 我发现对于布尔'类型,验证器总是返回True,如下所示:

import cerberus
bool_schema = {'name': {'type': 'boolean', 'required': True}}
cerberus.schema_registry.add('bool_schema', bool_schema)

v = cerberus.Validator({'name': {'schema': 'bool_schema'}})
test1 = {'name': 'a'}
test2 = {'name': 0}
print(v.validate(test1))
print(v.validate(test2))

上面的代码打印出两个Trues 实际上,我需要的是验证值是True还是False(Python中的bool类型),其他值不应该通过验证器。

2 个答案:

答案 0 :(得分:2)

这是一个语义问题。虽然您没有明确指定要实现的目标,但我假设您要测试字典中映射到name的值是否为布尔值并确保它存在。

在示例代码的第4行中,您定义了一个模式,该模式引用了模式注册表中先前定义的模式。验证时,它将被解释为

{'name': 
    {'schema': {
       {'type': 'boolean',
        'required': True}
}}}

只会处理第二级schema规则if the value of name is a mapping。在每个示例中都不是这种情况,根本不会有效处理任何规则,因此验证每次都会返回True

为了回答我上面提到的问题,这将涵盖它:

import cerberus
required_boolean = {'type': 'boolean', 'required': True}
cerberus.rules_set_registry.add('required_boolean', required_boolean)
v = cerberus.Validator({'name': 'required_boolean'})

答案 1 :(得分:1)

可能是架构注册表的问题(我打开了ticket,因此我们可以进一步调查 - 将在此处报告。)

与此同时,您可以跳过注册表,它可以正常工作:

from cerberus import Validator

schema = {'name': {'type': 'boolean', 'required': True}}

v = Validator()
v.validate({'name': 'a'})
False

v.errors
{'name': ['must be of boolean type']}

为未来的读者编辑:@ funky-future下面的答案实际上解释了为什么你的代码失败了,以及如何修复它。