所以我使用 Cerberus 进行模式验证,但我遇到了一个特殊情况,即验证 key 未知的字典的子字典。
假设我有以下文件:
dict = {
'things': {
'0463': {
'foo': 'blah',
'bar': 'bleep'
},
'0464': {
'foo': 'x',
'bar': 'y'
},
'another_random_id': {
'foo': 'blah',
'bar': 'bleep'
}
}
所以我想验证子词典是否具有特定结构(foo
和 bar
作为键),但我想不出一种方法来验证它提前知道 key (在我的例子中是随机 ID。我认为这是对 valueschema 的一个很好的使用,但我似乎无法让 valueschema 与“dict”类型的东西一起工作。我试图设置以下模式在 hell 犬中:
schema = {
'things': {
'type': 'dict',
'valueschema': {
'type': 'dict',
'foo': {'type': 'string'},
'bar': {'type': 'string'}
}
}
}
我是否错误地定义了我的模式,或者这对于 valueschema
的当前实现是不可能的。我在存储库中看到一些使用 valueschema
的测试,但它们只测试 valueschema
的类型是 int 还是 string。
最佳答案
所以我发现 cerberus 将处理 valueschema
如果它是类型 dict
如果我在 valueschema 之后放置一个
键。所以我的结构应该是:schema
字段
schema = {
'things': {
'type': 'dict',
'valueschema': {
'type': 'dict',
'schema':{
'foo': {'type': 'string'},
'bar': {'type': 'string'}
}
}
}
}
现在仍然有些奇怪,因为 valueschema
的设计似乎并没有预期它会验证 dict
类型的值。例如,当我从验证器扩展时,我必须覆盖 validate_valueschema
方法,以便 required
验证的行为与常规模式相同,因为当它调用validate
未传入 update
参数的模式。所以我重写的 validate_valueschema
看起来像这样:
def _validate_valueschema(self, schema, field, value):
if isinstance(value, Mapping):
for key, document in value.items():
validator = self._Validator__get_child_validator()
validator.validate(
{key: document}, {key: schema},
context=self.document, update=self.update)
if len(validator.errors):
self._error(field, validator.errors)
update=self.update
是我添加的所有内容。
关于python - 在 Cerberus 中,您可以使用类型为 'valueschema' 的 'dict' 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37687293/