Python 为密钥类型验证获取更好的模式错误消息?

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:或者可能是我的模式不正确?我的目标是

我有一个这样的模式(示例):

如果我传递一个int(比如
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)
    }]
})