在 Python 中使用 cerberus 来验证布尔值
Using cerberus in Python to validate boolean values
我正尝试在 Python 中使用 Cerberus 来验证一些数据。
我发现对于 'boolean' 类型,验证器总是 return 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))
上面的代码打印了两个True。
实际上,我需要的是验证该值是True还是False(Python中的bool类型),其他值不应通过验证器。
可能是架构注册表的问题(我打开了一个 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 的回答实际上解释了您的代码失败的原因,以及如何修复它。
这是一个语义问题。尽管您没有明确指定要实现的目标,但我假设您想测试字典中映射到 name
的值是否为布尔值并确保它存在。
在您的示例代码的第 4 行中,您正在定义一个架构,该架构引用先前从架构注册表中定义的架构。验证时它将被解释为
{'name':
{'schema': {
{'type': 'boolean',
'required': True}
}}}
second-level schema
规则只会被处理 if the value of name
is a mapping。在您的每个示例中,情况并非如此,这将有效地处理任何规则,因此每次都进行验证 returns True
。
为了回答我上面假设的问题,这将涵盖它:
import cerberus
required_boolean = {'type': 'boolean', 'required': True}
cerberus.rules_set_registry.add('required_boolean', required_boolean)
v = cerberus.Validator({'name': 'required_boolean'})
我正尝试在 Python 中使用 Cerberus 来验证一些数据。
我发现对于 'boolean' 类型,验证器总是 return 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))
上面的代码打印了两个True。
实际上,我需要的是验证该值是True还是False(Python中的bool类型),其他值不应通过验证器。
可能是架构注册表的问题(我打开了一个 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 的回答实际上解释了您的代码失败的原因,以及如何修复它。
这是一个语义问题。尽管您没有明确指定要实现的目标,但我假设您想测试字典中映射到 name
的值是否为布尔值并确保它存在。
在您的示例代码的第 4 行中,您正在定义一个架构,该架构引用先前从架构注册表中定义的架构。验证时它将被解释为
{'name':
{'schema': {
{'type': 'boolean',
'required': True}
}}}
second-level schema
规则只会被处理 if the value of name
is a mapping。在您的每个示例中,情况并非如此,这将有效地处理任何规则,因此每次都进行验证 returns True
。
为了回答我上面假设的问题,这将涵盖它:
import cerberus
required_boolean = {'type': 'boolean', 'required': True}
cerberus.rules_set_registry.add('required_boolean', required_boolean)
v = cerberus.Validator({'name': 'required_boolean'})