Что такое декораторы?

1. Что такое декоратор

  • Декоратор — это функция, которая принимает другую функцию и возвращает её (или изменённую версию).

  • Используется для добавления функционала к функции или методу без изменения её исходного кода.


2. Синтаксис

@decorator_name
def my_function():
    pass
  • Это аналогично:

def my_function():
    pass

my_function = decorator_name(my_function)

3. Пример простого декоратора

def my_decorator(func):
    def wrapper():
        print("До выполнения функции")
        func()
        print("После выполнения функции")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

Вывод:

До выполнения функции
Hello!
После выполнения функции

4. Декоратор с аргументами функции

def decorator(func):
    def wrapper(a, b):
        print(f"Суммируем {a} и {b}")
        return func(a, b)
    return wrapper

@decorator
def add(x, y):
    return x + y

result = add(5, 3)
print(result)  # 8

5. Декораторы в автоматизации тестирования

  • Логирование выполнения тестов:

def log(func):
    def wrapper(*args, **kwargs):
        print(f"Запуск {func.__name__}")
        result = func(*args, **kwargs)
        print(f"Завершение {func.__name__}")
        return result
    return wrapper

@log
def test_login():
    assert login("user", "pass") == True
  • Повтор попыток (retry) при падении теста:

def retry(times):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(times):
                try:
                    return func(*args, **kwargs)
                except AssertionError:
                    print("Попытка неудачна")
        return wrapper
    return decorator

@retry(3)
def flaky_test():
    assert random.choice([True, False])
  • Измерение времени выполнения теста:

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__} заняла {end-start:.4f} секунд")
        return result
    return wrapper

💡 Вывод:

  • Декораторы = способ добавить функционал к функции/методу без изменения исходного кода.

  • Часто используются в логировании, retry, тайминге, проверках pre/post условий в автотестах.

Last updated

Was this helpful?