В декораторе ошибочны wrap, time.now и return в finally. Нужно functools.wraps, монотонный таймер и логирование без подмены результата; декоратор должен быть определён до применения.
FastAPI, PostgreSQL (orm), RabbitMQ, Redis, Eternal APIs
В декораторе ошибочны 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, иначе измерится только создание корутины. Перечень технологий и каталогов в начале сам по себе не задаёт другой исполняемый фрагмент.