Обёртка печатает имя и args, вызывает функцию, печатает её результат и возвращает его. В полном примере Result: 8 появится дважды: один раз в декораторе и ещё раз во внешнем print.
Декоратор, выводящий имя функции, её аргументы и результат
Обёртка печатает имя и args, вызывает функцию, печатает её результат и возвращает его. В полном примере Result: 8 появится дважды: один раз в декораторе и ещё раз во внешнем print.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Требуется реализовать декоратор log_execution, который при вызове функции будет отображать её название, переданные позиционные аргументы и полученный результат.
import functools
def log_execution(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
# TODO: добавить вывод информации о вызове
pass
return wrapper
@log_execution
def add_numbers(x, y):
return x + y
# Проверка работы декоратора
outcome = add_numbers(3, 5)
print("Result:", outcome)
# Ожидаемый вывод:
# Executing function: add_numbers
# Arguments: (3, 5)
# Result: 8
Ответ
Обёртка печатает имя и args, вызывает функцию, печатает её результат и возвращает его. В полном примере Result: 8 появится дважды: один раз в декораторе и ещё раз во внешнем print.
Учебная реализация для нечувствительных данных:
import functools
def log_execution(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f'Executing function: {func.__name__}')
print(f'Arguments: {args}')
result = func(*args, **kwargs)
print(f'Result: {result}')
return result
return wrapper
При исключении строка результата не выводится, а ошибка распространяется наружу. kwargs передаются функции, но не печатаются, согласно условию о позиционных аргументах. В production вместо сырых аргументов и результата используйте разрешённые поля с маскированием секретов и персональных данных.