有没有办法用妖娆定义条件规则?
这是我的架构:
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的信息,但我无法在那里找到我的案例。
答案 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
一致。
另一种方法可能是为完整字典编写验证函数,其中函数同时检查resolution
和bitrate
,但这样你就可以写一些你通常可以免费获得的代码。
[1] https://github.com/alecthomas/voluptuous#validation-functions