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

ДЗ 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 Публикация в TestPyPI1
Итого7