ДЗ 2 — Функциональное программирование и декораторы
📚 Лекция: Функциональное программирование
Тема курса: модуль 3 (ФП, функции, декораторы) Дедлайн: 16 апреля 2026, 23:59 Classroom: Принять задание
2.1 — Система параметризованных декораторов (4 балла) ★★☆
Реализуй набор декораторов. Один обязательный для всех, плюс 2 из пула по варианту.
Обязательный для всех
@validate_types — проверяет аргументы и возвращаемое значение на соответствие аннотациям в runtime:
@validate_types
def add(a: int, b: int) -> int:
return a + b
add(1, 2) # → 3
add("1", 2) # → TypeError: argument 'a' expected int, got str
Пул вариантов (2 из 6 по калькулятору)
| # | Декоратор | Описание |
|---|---|---|
| 0 | @curry | Каррирование: f(a, b, c) → f(a)(b)(c) |
| 1 | @memoize(ttl=None) | Кэширование с опциональным TTL в секундах |
| 2 | @retry(times, delay, exceptions) | Повтор с экспоненциальным backoff |
| 3 | @deprecated(msg, removal_version) | DeprecationWarning при вызове |
| 4 | @trace | Логирование аргументов, результата и времени выполнения |
| 5 | @throttle(rate) | Ограничение: не чаще N вызовов в секунду |
Требования ко всем декораторам:
- Параметризованные (фабрика декораторов), даже если параметры опциональны
functools.wraps— обязательно (__name__,__doc__,__annotations__сохраняются)- Composable — корректно работают при стекировании
- Полные type hints
@retry(times=3, delay=0.1, exceptions=(ConnectionError,))
@trace
@validate_types
def fetch(url: str) -> str:
...
Декораторы — один из самых практичных инструментов Python. @retry, @memoize, @trace встречаются в любом production-коде.
2.2 — Функциональный пайплайн (2 балла) ★★☆
Реализуй функции pipe() и compose() для построения пайплайнов обработки данных.
# pipe: применяет функции слева направо
pipeline = pipe(
read_csv, # str → list[dict]
filter_by(age=">18"), # list[dict] → list[dict] ← замыкание
sort_by("name"), # list[dict] → list[dict] ← замыкание
take(10), # list[dict] → list[dict] ← замыкание
to_json, # list[dict] → str
)
result = pipeline("data.csv")
# compose: применяет функции справа налево (математическое определение)
transform = compose(to_json, take(10), sort_by("name"), filter_by(age=">18"))
Требования:
filter_by,sort_by,take— реализовать как функции высшего порядка, возвращающие функции (замыкания)pipeиcompose— принимают произвольное число функций- Полные type hints (подсказка:
TypeVar,Callable)
Замыкания и функции высшего порядка — основа ФП. pipe/compose — паттерн, который встречается в pandas, SQLAlchemy, FastAPI и других популярных библиотеках.
2.3 — Публикация пакета в TestPyPI (1 балл) ★☆☆
Упакуй декораторы из задания 2.1 как отдельную библиотеку и опубликуй в TestPyPI.
Требования:
- Осмысленное имя пакета, версия
0.1.0 pyproject.tomlс[build-system](используйuvилиhatch)README.mdс примерами использования- Пакет устанавливается командой:
pip install --index-url https://test.pypi.org/simple/ <имя> - Ссылку на TestPyPI вставь в
STUDENT.md
Публикация пакета — навык, который отличает разработчика, умеющего делиться кодом, от того, кто пишет только для себя.
Итого
| Задача | Баллы |
|---|---|
| 2.1 Декораторы (@validate_types + 2 варианта) | 4 |
| 2.2 pipe() и compose() | 2 |
| 2.3 Публикация в TestPyPI | 1 |
| Итого | 7 |