ДЗ 1 — Модель данных, CLI, пакетирование
📚 Лекции: Модель данных Python | Виртуальные среды и пакетные менеджеры
Тема курса: модуль 1 (модель данных) + модуль 2 (виртуальные среды, пакеты) Дедлайн: 16 апреля 2026, 23:59 Classroom: Принять задание
1.1 — Настройка окружения (1 балл) ★☆☆
Настрой рабочее окружение для курса:
- Установи
uv— современный пакетный менеджер Python - Создай виртуальное окружение через
uv venv - Установи зависимости проекта:
uv sync - Убедись что тесты запускаются через
uv run pytest - Зафиксируй версии зависимостей в
uv.lock
Артефакт: uv.lock в репозитории, команда uv run pytest hw01/tests/ проходит в CI.
Виртуальные окружения — основа воспроизводимой разработки. uv — современный стандарт, вытесняющий pip + venv в production-проектах.
1.2 — Контейнерный тип данных (3 балла) ★★☆
Реализуй свой контейнерный тип данных, который ведёт себя как встроенный Python-объект. Твой вариант определяется калькулятором.
Варианты:
| # | Контейнер | Описание |
|---|---|---|
| 0 | SortedList | Список с автосортировкой при вставке |
| 1 | LimitedDict | Словарь с максимумом N ключей, LRU-вытеснение |
| 2 | TypedList | Список с проверкой типа при вставке |
| 3 | FrozenDict | Неизменяемый словарь с поддержкой __hash__ |
| 4 | ChainList | Лениво объединяет несколько списков |
| 5 | BiDict | Двунаправленный словарь: ключ ↔ значение |
| 6 | RingBuffer | Циклический буфер фиксированного размера |
| 7 | DefaultList | Аналог defaultdict, но для с писка |
Обязательные требования:
__len__,__getitem__,__setitem__,__delitem____iter__,__reversed__(где применимо)__contains__,__repr__,__str__- Поддержка протокола
SequenceилиMutableMapping(черезcollections.abc) - Полные type hints, docstring класса
Контейнер должен работать со встроенными функциями:
c = YourContainer(...)
len(c) # __len__
for x in c: # __iter__
pass
x in c # __contains__
c[0] # __getitem__
Модель данных Python построена на протоколах. Понимание того, как for, in, len() взаимодействуют с dunder-методами — фундамент всего курса.
1.3 — CLI-утилита как installable package (2 балла) ★☆☆
Реализуй одну из CLI-утилит Unix и упакуй её как Python-пакет. Утилита определяется по твоему варианту контейнера (задание 1.2):
| Вариант контейнера | Утилита | Что делает |
|---|---|---|
| 0, 3, 6 | wc | Подсчёт строк, слов, байт |
| 1, 4, 7 | nl | Нумерация строк |
| 2, 5 | tail | Последние N строк файла |
Требования к реализации:
- Использовать
argparseилиclick - Обрабатывать как файловый аргумент, так и
stdin - Корректная обработка ошибок (файл не найден, нет прав)
Требования к пакетированию:
pyproject.tomlс заполненными метаданными (name,version,description,authors)__main__.pyдля запуска черезpython -m <package>[project.scripts]entry point: послеuv installутилита доступна как команда в терминале
[project.scripts]
my-wc = "my_wc.__main__:main"
После установки должно работать:
uv tool install .
my-wc README.md
my-wc --lines README.md
cat README.md | my-wc
Понимание того, как Python находит и запускает код, как устроена система пакетов — необходимо для любой production-разработки.
Итого
| Задача | Баллы |
|---|---|
| 1.1 Настройка окружения | 1 |
| 1.2 Контейнерный тип | 3 |
| 1.3 CLI-пакет с entry point | 2 |
| Итого | 6 |