2

我正在使用 voluptuous 0.9.2,但 Exclusive 类有问题。我需要,如果没有键,它应该给出一个错误。但是,这对于性感来说是可以的。这是肉欲的错误吗?如果没有,我该如何为此编写脚本?

为了澄清我的问题,假设我们构建了这样的模式:

schema = Schema({Exclusive('a', 'z'): int, Exclusive('b', 'z'): int, 'c': int}, required=True)

我需要提供一个且只有一个排除组中的密钥。但是当我用 进行测试时{'c': 5},即使我没有给出a或,它似乎也是有效的b。我不知道如何使它特别适用于这种情况。

4

2 回答 2

1

根据文档Exclusive继承自Optional,这意味着ab在您的架构中是可选的;这就是为什么{'c': 5}是一个有效的输入。要解决此问题,您需要根据需要明确指定它们:

from voluptuous import Schema, Exclusive, Required
schema = Schema({Required(Exclusive('a', 'z')): int, Required(Exclusive('b', 'z')): int, 'c': int}, required=True)
于 2016-10-22T08:28:05.377 回答
1

这里的一个技巧是使用两个需要同时验证的不同模式:

from voluptuous import All, Any, Exclusive, Required                                                                                                                         

schema = All(                                                                                                                                                                
    {                                                                                                                                                                        
        Exclusive('a', 'z'): int,                                                                                                                                            
        Exclusive('b', 'z'): int,                                                                                                                                            
        Required('c'): int,                                                                                                                                                  
    },                                                                                                                                                                       
    {                                                                                                                                                                        
        Required(Any('a', 'b')): int,                                                                                                                                        
        Required('c'): int,                                                                                                                                                  
    },                                                                                                                                                                       
)

第一个模式在两者都存在时无法验证,ab第二个模式在两者a都不b存在时失败。因此,要么ab需要存在。

于 2018-05-22T17:54:41.710 回答