在 Cerberus 中,您可以将 'valueschema' 与类型 'dict' 一起使用吗?

In Cerberus can you use 'valueschema' with a type of 'dict'?

所以我正在使用 Cerberus 进行模式验证,但我 运行 进入了一个特定的验证字典的子字典,其键是未知的。

假设我有以下文件:

dict = {
   'things': {
       '0463': {
           'foo': 'blah',
           'bar': 'bleep'
        },
        '0464': {
           'foo': 'x',
           'bar': 'y'
        },
        'another_random_id': {
           'foo': 'blah',
           'bar': 'bleep'
        }
}

所以我想验证子词典是否具有特定的结构(foobar 作为键),但我无法在不知道前面的键的情况下找到验证它的方法时间(在我的例子中是随机 id。我认为这是对 valueschema 的一个很好的使用,但我似乎无法让 valueschema 与 'dict' 类型的东西一起工作。我试图在 cerberus 中设置以下模式:

schema = {
    'things': {
        'type': 'dict',
        'valueschema': {
             'type': 'dict',
             'foo': {'type': 'string'},
             'bar': {'type': 'string'}
         }
     }
}

我是否错误地定义了我的架构,或者这对于 valueschema 的当前实现是不可能的。我在存储库中看到一些使用 valueschema 的测试,但它们只测试 valueschema 的类型是 int 还是字符串。

所以我发现,如果我在 valueschema 键后放置一个 schema 字段,cerberus 将处理 valueschema 如果它是 dict 类型。所以我的结构应该是:

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是我加的。