Код 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
- Сначала проверьте
None, затем тип, затемminиenum. isinstance(True, int)истинно.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.