性感有条件规则吗?

时间:2014-06-14 17:08:01

标签: python validation voluptuous

有没有办法用妖娆定义条件规则?

这是我的架构:

from voluptuous import Schema, All, Any

schema = Schema({
    'resolution': All(str, Any('1920x1080', '1280x720')),
    'bitrate': 20,
})

没关系,但现在我想根据分辨率值验证比特率值。如果我有1920x1080作为分辨率,那么我需要保证比特率是这些值之一:20,16,12,8;当它是1280x720时,比特率应该是以下之一:10,8,6,4。

我该怎么做?关于project's github page的信息,但我无法在那里找到我的案例。

2 个答案:

答案 0 :(得分:7)

我遇到类似问题的方法是做类似

的事情
from voluptuous import Schema, Any

lo_res = Schema({'resolution': '1280x720', 'bitrate': Any(10, 8, 6, 4)})
hi_res = Schema({'resolution': '1920x1080', 'bitrate': Any(20, 16, 12, 8)})
schema = Any(lo_res, hi_res)

这将为您提供正确的验证,尽管错误消息可能会有点神秘。您可以编写更自定义的Any版本来改进错误消息。

答案 1 :(得分:4)

Voluptuous支持自定义验证函数[1],但它们仅接收当前验证的值作为输入参数,而不是任何其他先前验证的值。这意味着尝试执行类似'bitrate': (lambda bitrate, resolution: Any(20, 16, 12, 8) if bitrate in (...) else Any (10, 8, 6, 4))的操作很遗憾不会起作用。

您可以尝试使用'bitrate': Any(20, 16, 12, 10, 8, 6, 4),然后自行执行二次验证,以确保它与resolution一致。

另一种方法可能是为完整字典编写验证函数,其中函数同时检查resolutionbitrate,但这样你就可以写一些你通常可以免费获得的代码。

[1] https://github.com/alecthomas/voluptuous#validation-functions