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.