Какие задачи решал с помощью своих декораторов в Python
Что проверяют
Пишете ли вы декораторы сами, а не только ставите чужие @task и @lru_cache. Для data-ml интересно, какие именно повторяющиеся куски пайплайна вы вынесли в обёртку. Следом обычно просят написать декоратор с параметрами прямо на собеседовании.
Как отвечать
Коротко про механику: декоратор это функция, которая принимает функцию и возвращает новую, @deco над def f равносильно f = deco(f). Внутри обязательно functools.wraps, иначе теряются __name__, докстринг и сигнатура. Декоратор с аргументами это три уровня вложенности: фабрика, сам декоратор, обёртка.
Дальше две или три задачи из своей практики. Типичные для данных и ML:
- повтор с паузой: запросы к API, S3 или базе иногда падают по таймауту. Декоратор ловит заданные исключения и повторяет вызов с экспоненциальной задержкой. В проде это часто готовая
tenacity, но свою версию стоит уметь написать; - замер и логирование шагов: время этапа пайплайна через
time.perf_counter(), размер входного и выходного датафрейма, запись в лог или в MLflow; - кэш тяжёлых вычислений: признаки, которые считаются минутами, сохраняются на диск по хэшу аргументов. Для этого есть
joblib.Memory, в Streamlit@st.cache_data; - проверка схемы: перед вызовом убедиться, что в датафрейме есть нужные колонки и типы, чтобы пайплайн падал сразу, а не через час на обучении;
- регистрация: словарь моделей или трансформеров, куда класс попадает через
@register("catboost"), а конфиг выбирает модель по имени.
Полезно показать, что вы знаете готовые декораторы экосистемы: @task и @dag в Airflow TaskFlow, @torch.no_grad(), @pa.check_types в pandera.
Где спотыкаются
Ставят @lru_cache на функцию, которая принимает датафрейм. DataFrame не хэшируется, и вызов падает с TypeError, с numpy-массивами то же самое.
Меряют время через time.time(). Для замеров нужен time.perf_counter(): он монотонный и точнее на коротких интервалах.
Путают порядок: декораторы применяются снизу вверх, ближайший к def оборачивает функцию первым. Ретрай над кэшем и кэш над ретраем ведут себя по-разному.