FastAPI, PostgreSQL (orm), RabbitMQ, Redis, Eternal APIs

В декораторе ошибочны wrap, time.now и return в finally. Нужно functools.wraps, монотонный таймер и логирование без подмены результата; декоратор должен быть определён до применения.

Короткий ответ

Что ответить на собеседовании

В декораторе ошибочны wrap, time.now и return в finally. Нужно functools.wraps, монотонный таймер и логирование без подмены результата; декоратор должен быть определён до применения.

Подробный разбор

Ответ с пояснениями

Условие

FastAPI, PostgreSQL (orm), RabbitMQ, Redis, Eternal APIs

src/api src/application src/domain src/inf

from functools import wrap

@zasekay def go_to_mongodb(...):

def zasekay(func): @wrap(func) def wrapper(*args, **kwargs): start = time.now() try: return func(*args, **kwargs) finally: end_time = time.now() - start return f"{func.name} {end_time}" return wrapper

Ответ

В декораторе ошибочны wrap, time.now и return в finally. Нужно functools.wraps, монотонный таймер и логирование без подмены результата; декоратор должен быть определён до применения.

import logging
from functools import wraps
from time import perf_counter

logger = logging.getLogger(__name__)

def zasekay(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = perf_counter()
        try:
            return func(*args, **kwargs)
        finally:
            logger.info('%s duration=%.6f', func.__name__, perf_counter() - start)
    return wrapper

return в finally перекрыл бы и результат функции, и исключение. Для async def нужна async-обёртка с await, иначе измерится только создание корутины. Перечень технологий и каталогов в начале сам по себе не задаёт другой исполняемый фрагмент.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее