from dataclasses import dataclass, field from typing import Callable @dataclass class User: username: str is_authenticated: bool = False roles: list[str] = field(default_factory=lambda: ["user"]) def required_roles(roles: list[str]): def wrapper(fonction: Callable): def internal_wrapper(user: User): if not any(role in user.roles for role in roles): # True => [False, False, True] raise PermissionError(f"L'utilisateur {user.username} n'a pas le rôle requis.") return fonction(user) return internal_wrapper return wrapper @required_roles(["admin", "modo"]) def operation_sensible(user: User): return f"Opération sensible faite par {user.username}" alice = User("alice@courriel.fr", True, ["modo"]) bob = User("bob@courriel.fr", True) print(operation_sensible(alice))