Ямалов Искандер Ильдарович, М8О-106БВ-25
Данное консольное приложение реализует систему управления библиотекой книг с использованием пользовательских коллекций, индексации и симуляции работы библиотеки. Проект демонстрирует применение объектно-ориентированного программирования, абстрактных классов, композиции и фасадного паттерна.
lab4/
├── src/ # Исходный код
│ ├── __init__.py
│ ├── main.py # Точка входа в приложение
│ ├── models/ # Модели данных
│ │ ├── __init__.py
│ │ ├── book.py # Модель книги (Book)
│ │ └── base_collections.py # Базовый интерфейс коллекций (BaseCollection)
│ ├── collections/ # Пользовательские коллекции
│ │ ├── __init__.py
│ │ ├── book_collection.py # Списоковая коллекция книг (BookCollection)
│ │ └── index_dict.py # Индексированная коллекция (IndexDict)
│ ├── library/
│ │ ├── __init__.py
│ │ └── library.py # Класс Library
│ ├── simulation/ # Симуляция работы
│ │ ├── __init__.py
│ │ ├── runner.py # Функции симуляции
│ │ └── constants.py # Константы для симуляции
│ └── common/ # Общие компоненты
│ ├── __init__.py
│ └── config.py # Конфигурация логирования
│
├── tests/ # Unit тесты
│ ├── __init__.py
│ ├── test_book.py # Тесты модели Book
│ ├── test_book_collection.py # Тесты BookCollection
│ ├── test_index_dict.py # Тесты IndexDict
│ ├── test_library.py # Тесты Library
│ └── test_runner.py # Тесты симуляции
│
├── uv.lock # Зависимости проекта
├── requirements.txt # Зависимости проекта
├── pyproject.toml # Конфигурация проекта
├── .gitignore # git ignore файл
└── README.md # Описание проекта
Использование: main [--steps <число>] [--seed <число>]
Описание: Запускает симуляцию работы библиотеки с заданным количеством шагов. Симуляция демонстрирует различные операции с библиотекой: добавление, удаление, обновление книг, поиск по различным критериям и обновление индексов.
Параметры:
--stepsили-st- количество шагов симуляции (по умолчанию: 20)--seedили-se- seed для генератора случайных чисел (по умолчанию: -1, означает случайный seed)
Примеры:
python -m src.main --steps 20 --seed 42
python -m src.main -st 10 -se 123
python -m src.mainСобытия симуляции:
- Добавление случайной книги - создает и добавляет новую книгу со случайными параметрами
- Удаление случайной книги - удаляет случайную книгу из библиотеки
- Обновление названия книги - изменяет название случайной книги
- Поиск книг - выполняет поиск по одному из критериев:
- По автору
- По жанру
- По году издания
- Комбинированный поиск (по автору, названию и году)
- Получение книги - получает книгу по ISBN или случайному ISBN
- Обновление индексов - пересоздает все индексы библиотеки
Класс книги с валидацией всех полей:
title- название книги (не может быть пустым)author- автор книги (не может быть пустым)year- год издания (должен быть в диапазоне от 0 до текущего года)genre- жанр (не может быть пустым)isbn- уникальный идентификатор (не может быть пустым)
Валидация:
- Все строковые поля проверяются на пустоту и тип
- Год издания проверяется на допустимый диапазон
- Все ошибки валидации вызывают соответствующие исключения (
ValueError,TypeError)
Абстрактный базовый класс, определяющий интерфейс для коллекций книг:
add(book)- добавление книгиremove(book_or_isbn)- удаление книги__len__()- количество книг__iter__()- итерация по книгам__getitem__(key)- доступ по ключу__contains__(item)- проверка наличия
Списковая коллекция книг, наследующая BaseCollection:
- Хранит книги в виде списка
- Позволяет доступ по индексу и срезу
- Поддерживает все операции базового интерфейса
Индексированная коллекция с тремя индексами, наследующая BaseCollection:
- По ISBN (
_isbn_index) - быстрый поиск одной книги по уникальному идентификатору - По автору (
_author_index) - поиск всех книг автора (возвращает множество) - По году (
_year_index) - поиск всех книг года издания (возвращает множество)
Методы:
clear()- очистка всех индексовget_by_author(author)- получение книг по автору (возвращает пустое множество, если нет)get_by_year(year)- получение книг по году (возвращает пустое множество, если нет)
Класс библиотеки, объединяющий BookCollection и IndexDict:
add_book(book)- добавление книги в библиотекуremove_book_by_isbn(isbn)- удаление книги по ISBNfind_by_author(author)- поиск всех книг по авторуfind_by_year(year)- поиск всех книг по году изданияfind_by_genre(genre)- поиск всех книг по жанру (линейный поиск по коллекции)find_by_isbn(isbn)- поиск книги по ISBN (вызываетKeyError, если не найдена)get_book(isbn=None, author=None, title=None, year=None)- получение книги по ISBN или комбинации параметровupdate_index()- обновление всех индексов на основе текущего состояния коллекции книг__call__(isbn)- магический метод для вызова библиотеки как функции__contains__(isbn)- магический метод для проверки наличия книги
Все компоненты обрабатывают следующие типы ошибок:
- ValueError - невалидные параметры (пустые строки, недопустимые годы, дублирующиеся ISBN)
- TypeError - неверные типы данных (например, передача не-строки в строковое поле)
- KeyError - попытка найти несуществующую книгу по ISBN через
find_by_isbn
Приложение использует структурированное логирование:
-
Файл логов:
shell.log(в корне проекта) -
Формат:
%(asctime)s [%(levelname)s] %(name)s: %(message)s -
Ротация: При достижении размера 5 МБ создается новый файл (до 5 резервных копий)
-
Вывод: Логи записываются только в файл, консольный вывод отделен (используется
print)
Все события симуляции логируются:
- Запуск и завершение симуляции
- Добавление, удаление, обновление книг
- Поиск и получение книг
- Ошибки при выполнении операций
При использовании одинакового seed симуляция полностью детерминирована:
- Одинаковая последовательность событий
- Одинаковые данные для книг
- Идентичный вывод
Библиотека использует тройную индексацию для быстрого поиска:
- Поиск по ISBN: O(1)
- Поиск по автору: O(1) для доступа к множеству книг
- Поиск по году: O(1) для доступа к множеству книг
- Поиск по жанру: O(n) - линейный поиск по коллекции