Установите значения по умолчанию из схемы JSON во время проверки.Python

Программы на Python
Ответить
Anonymous
 Установите значения по умолчанию из схемы JSON во время проверки.

Сообщение Anonymous »

Я пытаюсь создать валидатор, который бы устанавливал значения по умолчанию из схемы JSON во время проверки.
Я нашел этот вопрос: пытаюсь создать валидатор схемы JSON в Python для установки значений по умолчанию и корректировки это немного.
Поскольку я использую "jsonschema==3.2.0", я придумал такой код:

Код: Выделить всё

def _with_default_setter_extension(validator_class):
"""Extend validator class with defaults setter.

With this extension, the validator class will set all defaults from a
schema being validated to a validated instance.
"""

def _set_defaults(validator, properties, instance, schema):
if not validator.is_type(instance, "object"):
return

valid = True
for prop, subschema in properties.items():
if prop in instance:
for error in validator.descend(
instance[prop],
subschema,
path=prop,
schema_path=prop,
):
valid = False
yield error

# set defaults only when validation is successful
if valid:
# set root default when instance is empty
if not instance and "default" in schema:
instance.update(schema["default"])
return

for prop, subschema in properties.items():
if "default" in subschema and not isinstance(instance, list):
instance.setdefault(prop, subschema["default"])

return jsonschema.validators.extend(
validator_class, {"properties": _set_defaults}
)
Все работает хорошо, за исключением одного важного для меня случая. Я написал такой тест, чтобы доказать, что он не работает в моем случае:

Код: Выделить всё

def test_defaults_from_oneOf_only_defaults_from_valid_schema_are_set():
"""When oneOf is used, I expect only defaults from the valid subschema to be set."""
schema = {
"oneOf": [
{
"properties": {
"p": {"enum": ["one"]},
"params": {"properties": {"q": {"default": 1}}},
}
},
{
"properties": {
"p": {"enum": ["two"]},
"params": {"properties": {"w": {"default": 2}}},
}
},
],
}
assert _VALIDATOR.validate({"p": "two", "params": {}}, schema) == {
"p": "two",
"params": {"w": 2},
}
Тест завершается с ошибкой утверждения:

Код: Выделить всё

AssertionError: assert {'p': 'two', 'params': {'q': 1, 'w': 2}} == {'p': 'two', 'params': {'w': 2}}
+{'p': 'two', 'params': {'q': 1, 'w': 2}}
-{'p': 'two', 'params': {'w': 2}}
Full diff:
- {'p': 'two', 'params': {'w': 2}}
+ {'p': 'two', 'params': {'q': 1, 'w': 2}}
?
Итак, мы видим, что, несмотря на недопустимость первой подсхемы, из ее «параметров» установлено значение по умолчанию («q»).
При некоторой отладке я обнаружил что когда вы переопределяете только валидатор «свойств», ему не хватает контекста. Поэтому, когда первая подсхема "params" проверяется, у меня нет контекста, сообщающего мне, что проверка параметра "p" не удалась, и мы все еще находимся в той же подсхеме.
Пожалуйста, дайте мне какую-либо информацию. в то, что я мог бы попробовать.

Подробнее здесь: https://stackoverflow.com/questions/728 ... validation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»