Цербер - Поле обязательно для заполнения, только когда встречается зависимость

Рассмотрим следующую схему

schema = {
    "value_type":{
        "type": "string", "required": True
    }, 
    "units": {
        "type": "string", 
         "dependencies": {"value_type": ["float", "integer"]},
         "required": True
    }
}

Я хочу units поле, обязательное для заполнения, только когда значение value_type поле либо float или же integer,

Вот поведение, которое я стремлюсь достичь

v = Validator(schema)
v.validate({"value_type": "float", "units": "mm"})  # 1. 
True
v.validate({"value_type": "boolean", "units": "mm"})  # 2.
False
v.validate({"value_type": "float"})  # 3.
False
v.validate({"value_type": "boolean"})  # 4.
True

Приведенная выше схема возвращает ожидаемый результат только для первых 3 случаев.

Если я изменю определение units (опуская "required": True) чтобы

"units": {"type": "string", "dependencies": {"value_type": ["float", "integer"]}}

тогда проверка

v.validate({"value_type": "float"})  # 3.
True

возвращается True что не то, что я хочу.

Я посмотрел на oneof правила в документации, но не смог найти способ применить это только к required имущество.

Я хочу, чтобы значение True только когда зависимость встречается.

Как мне изменить мою схему для достижения этой цели?

0 ответов

Поскольку ваши вариации охватывают более одного поля, *of правила не совсем подходят, тем более что в документе это поля верхнего уровня.

Я бы вообще советовал, что есть еще Python, и не все должно быть выражено схемой, так что вы можете просто определить две допустимые схемы и проверить их:

schema1 = {...}
schema2 = {...}

if not any(validator(document, schema=x) for x in (schema1, schema2)):
    boom()

Это также лучше для понимания, чем любая схема, с которой вы столкнетесь.

В качестве альтернативы, вы можете использовать check_with править. В примере показаны два различных способа отправки ошибки, причем последний является предпочтительным, когда ошибки представляются только людям, поскольку они допускают настраиваемые сообщения для различных ситуаций, в то время как отсутствует структурная информация об ошибке:

class MyValidator(Validator):
    def _check_with_units_required(self, field, value):
        if value in ("float", "integer"):
            if "units" not in self.document:
                self._error("units", errors.REQUIRED_FIELD, "check_with")
        else:
            if "units" in self.document:
                self._error(
                    "units", "The 'units' field must not be provided for value "
                             "types other than float or integer."
                )

schema = {
    "value_type": {
        "check_with": "units_required",
        "required": True,
        "type": "string"
    },
    "units": {
        "type": "string",
    }
}

validator = MyValidator(schema)

assert validator({"value_type": "float", "units": "mm"})
assert not validator({"value_type": "boolean", "units": "mm"})
assert not validator({"value_type": "float"})
assert validator({"value_type": "boolean"})
Другие вопросы по тегам