Добавьте print(func.name) внутри wrapper перед вызовом функции и используйте functools.wraps для сохранения её метаданных.
Вывести имя функции, оборачиваемой декоратором, изнутри декоратора
Добавьте print(func.__name__) внутри wrapper перед вызовом функции и используйте functools.wraps для сохранения её метаданных.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Внутри декоратора invert необходимо добавить вывод (например, через print) имени функции, которую он принимает и оборачивает. Это позволит увидеть, какая именно функция вызывается при применении декоратора.
from typing import Callable
def invert(func: Callable) -> Callable:
def wrapper(*args, **kwargs) -> list:
result = func(*args, **kwargs)
if isinstance(result, list):
result = list(map(lambda item: -item, result))
else:
raise RuntimeError()
return result
return wrapper
После внесения изменения декоратор будет выводить название перед выполнением логики инверсии результата.
Ответ
Добавьте print(func.name) внутри wrapper перед вызовом функции и используйте functools.wraps для сохранения её метаданных.
from functools import wraps
def invert(func):
@wraps(func)
def wrapper(*args, **kwargs):
print(func.__name__)
result = func(*args, **kwargs)
if not isinstance(result, list):
raise RuntimeError('Ожидался список')
return [-item for item in result]
return wrapper
Вывод происходит при каждом вызове декорированной функции, а не только в момент применения декоратора. Если перенести print во внешнюю invert, имя будет выведено при декорировании. Предполагается, что элементы поддерживают унарный минус; список строк приведёт к TypeError, и скрывать эту ошибку не нужно.