3类

时间:2017-01-30 19:11:07

标签: python voluptuous

我一直试图使用python库voluptuous几个小时,但我无法做出我想要的东西。

现在正在发挥作用:

PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
    vol.Required(CONF_ENTITY_ID): cv.entity_id,
    vol.Required(CONF_STATE): cv.slug,
    vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,

    vol.Optional(CONF_START, default=None): cv.template,
    vol.Optional(CONF_END, default=None): cv.template,
    vol.Optional(CONF_DURATION, default=None): cv.template,
})

但我想添加另一个约束:我希望提供正好2 [CONF_START, CONF_END, CONF_DURATION]。不多于,不少于2.

我被告知要使用ExclusiveInclusive,但我真的很困惑有多么性感。

我怎样才能让它像我想的那样工作?

1 个答案:

答案 0 :(得分:0)

最后,有人给了我解决方案

我需要将我的验证放到一个单独的函数中,并使用vol.All将我的第一个模式与函数连接起来:

def exactly_two_period_keys(conf):
    provided = 0
    for param in [CONF_START, CONF_END, CONF_DURATION]:
        if param in conf and conf[param] is not None:
            provided += 1
    if provided != 2:
        raise vol.Invalid('Error message here')
    return conf


PLATFORM_SCHEMA = vol.All(PLATFORM_SCHEMA.extend({
    vol.Required(CONF_ENTITY_ID): cv.entity_id,
    vol.Required(CONF_STATE): cv.slug,
    vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,

    vol.Optional(CONF_START, default=None): cv.template,
    vol.Optional(CONF_END, default=None): cv.template,
    vol.Optional(CONF_DURATION, default=None): cv.template,
}), exactly_two_period_keys)