获得更好的性感架构错误消息以进行密钥类型验证?



我有一个看起来像这样的模式(一个例子(:

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

有没有办法像这样使用voluptuous' Schema获得更清晰的密钥类型验证消息?

expected str for dictionary key type. Got 42

PS:或者可能是我的Schema不正确?我的目标是有一个字典,其中键是字符串或 unicode(这是一个示例(,值是具有特定值类型的特定键的字典列表。

更新

我尝试将密钥验证放在另一个架构中,以获得正确的错误消息,如下所示:

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收到的错误消息是"ok",我可以做一个try/except raise来输出更好的错误消息,但它被主Schema捕获,并且再次返回与以前相同的错误。

我遇到了完全相同的问题。这不是关于你的模式,而是关于性感的工作方式。

由于您为字典键而不是静态值定义了架构,因此它允许字典包含与该架构匹配的多个键。父架构的额外参数是 False(默认值(,这意味着任何额外的元素(任何与内部架构不匹配的键(都不会被接受(这很好,否则您无法确保所有键都针对内部架构进行验证(。这就是问题所在,extra=False 条件优先于内部架构的非验证。然后,整数键被视为额外的键,因为它与架构不匹配,然后被视为无效。使用同一架构验证多个键并不像 voluptuous 中的值验证那样有效和明确。

话虽如此,我最终得到了一个(肮脏的(解决方案。我只想输出一条消息,指出给定键上的键架构不匹配,然后再将其打印为额外参数。我做了和你一样的事情,为密钥验证定义了一个函数。此函数会验证自身密钥,如果没有,则会打印错误消息。引发 Invalid 将触发额外的参数错误消息,所以我之前退出了我的程序(它符合我的需求,但对于其他任何人都不是必需的(。

在您的情况下,它可能是这样的:

KEY_SCHEMA = Schema(Any(str, unicode))
def validate_key(my_key):
if type(my_key) is not str and type(my_key) is not unicode:
logger.error("{} is not a str or unicode. Aborting.") # if you use the logger library
sys.exit(1) # need to import sys
return KEY_SCHEMA (my_key)
Schema({
validate_key: [{
Required('first_name'): [Any(str, unicode)],
Required('age'): Any('int32', 'double'),
Required('something'): Any(int, long, float, str, unicode)
}]
})

相关内容

  • 没有找到相关文章

最新更新