ENIGMA AI
ENIGMA AI
Python Сложный

Как написать декоратор, который принимает дополнительные параметры?

Декораторы с параметрами в Python

Базовый декоратор (без параметров):

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Before")
        result = func(*args, **kwargs)
        print("After")
        return result
    return wrapper

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

Декоратор с параметрами:

Требуется три уровня вложенности:

def repeat(times):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@repeat(times=3)
def greet(name):
    print(f"Hello, {name}!")

greet("World")
# Hello, World!
# Hello, World!
# Hello, World!

Универсальный декоратор (с параметрами и без):

import functools

def smart_decorator(func=None, *, prefix="LOG"):
    def decorator(fn):
        @functools.wraps(fn)
        def wrapper(*args, **kwargs):
            print(f"[{prefix}] Calling {fn.__name__}")
            return fn(*args, **kwargs)
        return wrapper

    if func is not None:
        return decorator(func)
    return decorator

# Оба варианта работают:
@smart_decorator
def foo(): pass

@smart_decorator(prefix="DEBUG")
def bar(): pass

Декоратор-класс:

class Retry:
    def __init__(self, max_attempts=3):
        self.max_attempts = max_attempts

    def __call__(self, func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            for attempt in range(self.max_attempts):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    if attempt == self.max_attempts - 1:
                        raise
        return wrapper

@Retry(max_attempts=5)
def unstable_operation():
    pass

Похожие вопросы

Готовитесь к собеседованию?

ENIGMA AI — невидимый ИИ-помощник для технических интервью

Попробовать бесплатно
Все вопросы