我有一个看起来像这样的模式(一个例子):
Schema({
Any(str, unicode): [{
Required('first_name'): [Any(str, unicode)],
Required('age'): Any('int32', 'double'),
Required('something'): Any(int, long, float, str, unicode)
}]
})
如果我通过一个 int (比如说42
)作为键(Any(str, unicode)
),我得到:
<class 'voluptuous.error.Invalid'> : extra keys not allowed @ data[42]. Got ["my_value"]
这并不能很好地代表我的错误,因为它甚至没有告诉我们问题实际上是密钥的类型。值类型的错误是完美的,如下所示:expected str for dictionary value @ data[0]["my_key"]. Got 42
有没有办法使用 a 获得更清晰的密钥类型验证消息voluptuous' Schema
,就像这样?
expected str for dictionary key type. Got 42
PS:或者可能是我Schema
的不正确?我的目标是有一个字典,其中键是字符串或 unicode(这是一个示例),值是具有特定值类型的特定键的字典列表。
更新
我尝试将密钥验证放在另一个 Schema 中,以获得正确的错误消息,如下所示:
KEY_SCHEMA = Schema(Any(str, unicode))
def validate_key(my_key):
KEY_SCHEMA (my_key) # Here the correct error/message is raised
Schema({
validate_key: [{
Required('first_name'): [Any(str, unicode)],
Required('age'): Any('int32', 'double'),
Required('something'): Any(int, long, float, str, unicode)
}]
})
我从那里得到的错误消息KEY_SCHEMA
是“好的”,我可以做一个try/except raise
输出更好的错误消息,但它被 main 捕获,Schema
并且再次返回与以前相同的错误。