Sobes.tech
Back to questions
Middle
102
questionbank

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

Answer from AI

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}")

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