性感有条件规则吗?

Dmi*_*lov 4 python validation voluptuous

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

这是我的架构:

from voluptuous import Schema, All, Any

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

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

我怎样才能做到这一点?有项目的github页面的信息,但我找不到我的情况.

小智 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)
Run Code Online (Sandbox Code Playgroud)

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


mpa*_*lov 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在同一时间,虽然这样你会写一些代码,您通常从骄奢淫逸免费获得。

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