妖娆的专属班

时间:2016-10-22 07:35:55

标签: python voluptuous

我使用丰富的0.9.2并且我对Exclusive类有问题。我需要,如果没有任何键,它应该给出一个错误。然而,这是好的。这是一个妖娆的错误吗?如果没有,我怎么能为此编写脚本?

为了澄清我的问题,假设我们构建了一个类似的模式:

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

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

2 个答案:

答案 0 :(得分:1)

根据documentationExclusive继承自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)

答案 1 :(得分: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都存在时,第一个架构无法验证,而当ab都不存在时,第二个架构失败。因此,需要ab