对于voluptuous有没有条件规则?

5 投票
2 回答
3351 浏览
提问于 2025-04-18 09:47

有没有办法用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是一致的。

另一种方法是为整个字典写一个验证函数,这个函数会同时检查resolutionbitrate,不过这样的话,你就得自己写一些通常可以从voluptuous中免费获得的代码了。

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

撰写回答