是否有办法使用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。
我该怎么做呢?有项目的github页面上的信息,但我找不到我的情况。
对于类似的问题,我的解决方案是这样做
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版本来改进错误消息。
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
,尽管这样您将编写一些通常从voluptuous免费获得的代码。
[1] https://github.com/alecthomas/voluptuous验证函数