PythonDeveloppementArchitecture

Decorateurs Python avances : comprendre et creer des decorateurs robustes

18 janvier 2026 · Sphinx-Digital

Les decorateurs sont l’une des fonctionnalites les plus elegantes de Python. Ils sont utilises partout : Flask, FastAPI, pytest, Django.

Un decorateur simple

from functools import wraps

def mon_decorateur(func):
    @wraps(func)  # Preserve __name__, __doc__
    def wrapper(*args, **kwargs):
        print(f"Avant {func.__name__}")
        result = func(*args, **kwargs)
        print(f"Apres {func.__name__}")
        return result
    return wrapper

@mon_decorateur
def dire_bonjour(nom):
    print(f"Bonjour {nom}")

Decorateur avec parametres

def retry(max_attempts=3, delay=1.0, exceptions=(Exception,)):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            for attempt in range(max_attempts):
                try:
                    return func(*args, **kwargs)
                except exceptions as e:
                    if attempt == max_attempts - 1:
                        raise
                    time.sleep(delay * (2 ** attempt))
        return wrapper
    return decorator

@retry(max_attempts=3, delay=0.5, exceptions=(ConnectionError,))
def appel_api(url):
    return requests.get(url, timeout=5)

Decorateur de cache

class cache_result:
    def __init__(self, ttl_seconds=300):
        self.ttl = ttl_seconds
        self.cache = {}

    def __call__(self, func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            key = (args, tuple(sorted(kwargs.items())))
            if key in self.cache:
                result, timestamp = self.cache[key]
                if time.time() - timestamp < self.ttl:
                    return result
            result = func(*args, **kwargs)
            self.cache[key] = (result, time.time())
            return result
        return wrapper

@cache_result(ttl_seconds=60)
def get_user(user_id):
    return db.query(User).filter_by(id=user_id).first()

Notre formation Python couvre les patterns avances Python.