Вывести имя функции, оборачиваемой декоратором, изнутри декоратора

Добавьте 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, и скрывать эту ошибку не нужно.

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

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

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

Подробнее