Практика: каталог оборудования в памяти¶
Задача¶
Создайте catalog.py — консольную программу для небольшого каталога оборудования. Пользователь добавляет позиции, просматривает список, ищет по артикулу или названию и получает сводку. После завершения программы данные исчезают; сохранение в файл не входит в этот модуль.
Модель позиции¶
Каждая запись — словарь с одинаковыми обязательными ключами:
position = {
"article": "LO100",
"name": "Лоток перфорированный",
"quantity": 2,
"unit_price": 125.50,
}
Каталог является списком таких словарей.
Меню¶
1 — добавить позицию
2 — показать каталог
3 — найти по артикулу
4 — найти по названию
5 — показать сводку
0 — выйти
После выполнения команды меню появляется снова. Неизвестный пункт показывает сообщение и не завершает программу.
Правила данных¶
- артикул очищается от крайних и внутренних пробелов и переводится в верхний регистр;
- после нормализации артикул не может быть пустым;
- второй экземпляр того же нормализованного артикула отклоняется;
- название после
strip()не может быть пустым; - количество — целое число не меньше нуля;
- цена — число не меньше нуля;
- поиск по названию не зависит от регистра и ищет подстроку;
- пустой поисковый запрос отклоняется.
Обязательные функции¶
Названия можно расширить, но ответственность должна быть сохранена:
def normalize_article(value):
...
def missing_fields(position):
...
def find_by_article(catalog, article):
...
def search_by_name(catalog, query):
...
def add_position(catalog, position):
...
def catalog_summary(catalog):
...
def print_catalog(catalog):
...
Функции проверки, поиска и расчёта не должны вызывать input. missing_fields возвращает список отсутствующих обязательных ключей. Функция catalog_summary возвращает число строк, сумму единиц и общую стоимость.
Контрольный каталог¶
| Ввод артикула | Название | Количество | Цена | Нормализованный артикул | Стоимость |
|---|---|---|---|---|---|
lo 100 |
Лоток перфорированный | 2 | 125.50 | LO100 |
251.00 |
cb200 |
Кабель силовой | 20 | 180.00 | CB200 |
3600.00 |
BX-10 |
Коробка монтажная | 0 | 95.00 | BX-10 |
0.00 |
Ожидаемая сводка:
Обязательные проверки¶
- Повторное добавление
LO100,lo100иlo 100распознаётся как дубль. - Поиск артикула
cb 200находитCB200. - Запрос
ЛОТОКнаходит позицию независимо от регистра. - Запрос
силнаходитКабель силовой. - Пустой запрос не возвращает весь каталог.
- Отрицательное количество и буквенная цена запрашиваются повторно.
- Каталог выводится по названию, не изменяя порядок хранения.
- Сводка совпадает с контрольными значениями.
- Словарь без
unit_priceотклоняется, а каталог не меняется. - Изменение исходного словаря после добавления не меняет сохранённую запись.
Критерии сдачи¶
- данные представлены списком словарей, а не параллельными списками;
- обязательные функции имеют одну понятную ответственность;
- неполная структура словаря обнаруживается до расчёта;
- артикулы сравниваются после нормализации;
- поиск и сводка не зависят от терминального ввода;
- контрольные и ошибочные сценарии подтверждены журналом;
- автор объясняет, какие функции изменяют каталог, а какие возвращают новый результат.