Назад к вопросам
Middle
60
questionbank

Что произойдет, если декоратор не возвращает никакого значения?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Если декоратор явно не возвращает никакого значения (или возвращает None), то функция, к которой он применен, будет заменена значением None. При последующем вызове такой "задекорированной" функции возникнет ошибка TypeError, поскольку будет предпринята попытка вызвать None как функцию.

# Пример 1: Декоратор, который ничего не возвращает
def my_decorator_broken(func):
    print("Вызов декоратора")
    # Нет оператора return

@my_decorator_broken
def my_function():
    print("Вызов функции")

# В этом месте my_function становится None

# Попытка вызвать my_function приведет к ошибке
# try:
#     my_function()
# except TypeError as e:
#     print(f"Ошибка: {e}") # Output: Ошибка: 'NoneType' object is not callable

Корректный декоратор для сохранения функциональности исходной функции должен возвращать либо саму исходную функцию, либо новую функцию (обычно обертку), которая вызывает исходную.

# Пример 2: Корректный декоратор, возвращающий обертку
import functools

def my_decorator_correct(func):
    @functools.wraps(func) # Сохраняет метаданные исходной функции
    def wrapper(*args, **kwargs):
        print("Перед вызовом функции")
        result = func(*args, **kwargs) # Вызов исходной функции
        print("После вызова функции")
        return result # Важно вернуть результат вызова исходной функции или None при необходимости
    return wrapper # Декоратор возвращает обертку

@my_decorator_correct
def my_function_correct(x, y):
    return x + y

# Вызов корректно задекорированной функции
result = my_function_correct(5, 3)
print(f"Результат вызова: {result}")

Таким образом, отсутствие возвращаемого значения в декораторе делает декорируемую функцию непригодной для вызова.