Перейти к основному содержимому

ДЗ 1 — Модель данных, CLI, пакетирование

📚 Лекции: Модель данных Python | Виртуальные среды и пакетные менеджеры

Тема и дедлайн

Тема курса: модуль 1 (модель данных) + модуль 2 (виртуальные среды, пакеты) Дедлайн: 16 апреля 2026, 23:59 Classroom: Принять задание


1.1 — Настройка окружения (1 балл) ★☆☆

Настрой рабочее окружение для курса:

  1. Установи uv — современный пакетный менеджер Python
  2. Создай виртуальное окружение через uv venv
  3. Установи зависимости проекта: uv sync
  4. Убедись что тесты запускаются через uv run pytest
  5. Зафиксируй версии зависимостей в uv.lock

Артефакт: uv.lock в репозитории, команда uv run pytest hw01/tests/ проходит в CI.

Зачем это

Виртуальные окружения — основа воспроизводимой разработки. uv — современный стандарт, вытесняющий pip + venv в production-проектах.


1.2 — Контейнерный тип данных (3 балла) ★★☆

Реализуй свой контейнерный тип данных, который ведёт себя как встроенный Python-объект. Твой вариант определяется калькулятором.

Варианты:

#КонтейнерОписание
0SortedListСписок с автосортировкой при вставке
1LimitedDictСловарь с максимумом N ключей, LRU-вытеснение
2TypedListСписок с проверкой типа при вставке
3FrozenDictНеизменяемый словарь с поддержкой __hash__
4ChainListЛениво объединяет несколько списков
5BiDictДвунаправленный словарь: ключ ↔ значение
6RingBufferЦиклический буфер фиксированного размера
7DefaultListАналог 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, 6wcПодсчёт строк, слов, байт
1, 4, 7nlНумерация строк
2, 5tailПоследние 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 point2
Итого6