对于voluptuous有没有条件规则?
有没有办法用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页面上有一些信息,但我找不到适合我情况的内容。
2 个回答
10
我解决类似问题的方法是这样做:
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)
这样做可以让你得到正确的验证,虽然错误信息可能会有点难懂。你可以写一个更个性化的版本来改善错误信息。
5
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#validation-functions