Код Middle Качество данных и контракты спрашивают часто обновлено

Проверка записей по контракту данных

Условие

Контракт: словарь поле -> {"type": "int" | "str" | "float", "required": bool, "min"?: число, "enum"?: список}. Напишите check_contract(records, contract): для каждой записи (словарь) найдите нарушения и верните список строк вида "<номер записи>:<поле>:<код>" в порядке записей, а внутри записи в порядке полей контракта, затем лишние поля по алфавиту. Коды:

  • missing: обязательное поле отсутствует или равно None;
  • type: значение не того типа (int не принимает bool и float; float принимает int и float, но не bool);
  • min: число меньше min;
  • enum: значение не из списка;
  • extra: поле не описано в контракте.

На поле выдавайте только первое нарушение в порядке missing, type, min, enum. Необязательное поле со значением None или отсутствующее нарушением не считается.

Примеры

check_contract([{"id":1,"amount":10.5,"status":"paid"}], {"id":{"type":"int","required":true},"amount":{"type":"float","required":true,"min":0},"status":{"type":"str","required":true,"enum":["new","paid"]}}) // []
check_contract([{"amount":-1,"status":"lost"}], {"id":{"type":"int","required":true},"amount":{"type":"float","required":true,"min":0},"status":{"type":"str","required":true,"enum":["new","paid"]}}) // ["0:id:missing", "0:amount:min", "0:status:enum"]
check_contract([{"id":"7","amount":true}], {"id":{"type":"int","required":true},"amount":{"type":"float","required":false}}) // ["0:id:type", "0:amount:type"]

Как подойти

Подсказки: 2
  1. Сначала проверьте None, затем тип, затем min и enum.
  2. isinstance(True, int) истинно.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.