Python-пакет с моделями и Protocol: итоговая задача
Собери ядро трекера задач: модели, Protocol и сервис
Что уже дано
В редакторе импортированы dataclass, Enum и Protocol; остальное ядро трекера нужно реализовать в одном файле. Проверяющая система не передаёт готовый репозиторий до кода ученика: после определения ваших типов она создаёт in-memory репозиторий с методами load и save и передаёт его в TaskService.
Что нужно сделать
Определите на верхнем уровне:
TaskStatus(Enum)с членамиTODO = "TODO"иDONE = "DONE";Taskкак@dataclassс полямиid: int,title: str,status: TaskStatus;TaskRepository(Protocol)с точными методамиload(self) -> list[Task]иsave(self, tasks: list[Task]) -> None;TaskService, чей__init__(self, repo: TaskRepository) -> Noneсохраняет репозиторий.
Методы TaskService:
add(self, title: str) -> Taskзагружает список, создаётid = max(существующих id, default=0) + 1, добавляет задачу со статусомTODO, сохраняет список и возвращает задачу;complete(self, task_id: int) -> Noneпереводит найденную задачу вDONEи сохраняет список, а для неизвестного id поднимаетValueError;list_open(self) -> list[Task]возвращает только задачи со статусомTODO.
Ввод и вывод
stdin не используется. Печатать через print в stdout ничего не нужно. Данные поступают через методы объекта TaskRepository: сервис вызывает load() и передаёт полный список в save(tasks). Название и id передаются аргументами методов сервиса; результаты возвращаются как Task, list[Task] или None согласно сигнатурам.
Пример использования
class MemoryRepo:
def __init__(self):
self.tasks = []
def load(self):
return self.tasks
def save(self, tasks):
self.tasks = tasks
repo = MemoryRepo()
service = TaskService(repo)
created = service.add("Написать документацию")
print(created.id, created.title, created.status.value)
print([task.title for task in service.list_open()])
Результат:
1 Написать документацию TODO
['Написать документацию']
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Protocol в Python: задача на структурные интерфейсы
- Аннотации типов Python: исправьте класс OrderLine
- Python: Форматировщик записей лога с Literal, X | None и TypeAlias
- Python: Обобщённая функция firstandlast с TypeVar и bound
- Python: Классификатор строк диагностики по инструменту
- Comprehension, enumerate и zip в Python: отчёт по студентам
