Python 为密钥类型验证获取更好的模式错误消息?
我有一个这样的模式(示例): 如果我传递一个int(比如Python 为密钥类型验证获取更好的模式错误消息?,python,validation,key,schema,voluptuous,Python,Validation,Key,Schema,Voluptuous,我有一个这样的模式(示例): 如果我传递一个int(比如42)作为键(Any(str,unicode)),我得到: :数据[42]不允许使用额外的键。获得[“我的价值”] 这并不代表我的错误,因为它甚至没有告诉我们问题实际上是密钥的类型。值类型的错误是完美的,如下所示:字典值@data[0][“my_key”]需要str。获得42个 有没有一种方法可以使用volupturous”模式获得更清晰的键类型验证消息,就像这样 字典键类型应为str。获得42个 PS:或者可能是我的模式不正确?我的目标是
42
)作为键(Any(str,unicode)
),我得到:
:数据[42]不允许使用额外的键。获得[“我的价值”]
这并不代表我的错误,因为它甚至没有告诉我们问题实际上是密钥的类型。值类型的错误是完美的,如下所示:字典值@data[0][“my_key”]需要str。获得42个
有没有一种方法可以使用volupturous”模式
获得更清晰的键类型验证消息,就像这样
字典键类型应为str。获得42个
PS:或者可能是我的模式不正确?我的目标是创建一个字典,其中键是字符串或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\u SCHEMA
中得到的错误消息是“ok”,我可以做尝试/except raise
来输出一个更好的错误消息,但是它被主SCHEMA
捕获,再次返回与以前相同的错误。我遇到了完全相同的问题。这不是关于你的模式,而是关于性感的工作方式
因为您为字典键定义了一个模式,而不是静态值,所以它允许字典包含多个与该模式匹配的键。父模式的额外参数为False(默认值),这意味着任何额外元素(与内部模式不匹配的任何键)都不会被接受(这很好,否则无法确保所有键都根据内部模式进行验证)。问题是,extra=False条件优先于内部模式的非验证。整数键随后被视为一个额外的键,因为它与模式不匹配,然后才被视为无效键。使用相同的模式验证多个键并不像voluptuous中的值验证那样有效和明确
话虽如此,我最终得到了一个(肮脏的)解决方案。我只想在作为额外参数打印之前,输出一条消息,说明密钥模式与给定密钥不匹配。我和您一样,为密钥验证定义了一个函数。此函数将验证密钥本身,如果未验证,则打印错误消息。引发一个无效参数将触发额外的参数错误消息,因此我在退出程序之前(它符合我的需要,但对其他人来说这不是必需的)
在您的情况下,可能是这样的:
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)
}]
})
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)
}]
})