Цербер - Поле обязательно для заполнения, только когда встречается зависимость
Рассмотрим следующую схему
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"})