【问题标题】:Getting a better Voluptuous Schema error message for key type validation?为密钥类型验证获取更好的 Voluptuous Schema 错误消息?
【发布时间】:2018-02-01 11:52:09
【问题描述】:

我有一个看起来像这样的架构(示例):

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(这是一个示例),值是具有特定键的字典列表,这些键具有特定的值类型。

更新

我尝试将密钥验证放在另一个 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 来输出一个更好的错误消息,但是它被主要的Schema 捕获并且和以前一样的错误是又回来了。

【问题讨论】:

    标签: python validation key schema voluptuous


    【解决方案1】:

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

    因为您为字典键而不是静态值定义了架构,所以它允许字典包含与该架构匹配的多个键。您的父模式的额外参数是 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)
        }]
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 2020-10-28
      • 1970-01-01
      • 2016-05-27
      • 2013-06-08
      • 1970-01-01
      • 2019-11-17
      相关资源
      最近更新 更多