Avancé
🧠 Fondamentaux
30 XP
0 personnes ont réussi
Registre de données avec validation automatique
Pour terminer cette serie, on va combiner plusieurs techniques avancees dans un cas realiste. Imagine que tu construis un système de configuration ou de registre de données qui valide automatiquement les valeurs qu'on y stocke.
Écris une classe ValidatedRegistry qui : 1. Fonctionne comme un context manager (with) 2. Permet d'enregistrer des regles de validation pour des clés (méthode add_rule) 3. Permet de stocker des valeurs qui sont automatiquement validees (méthode set) 4. Permet de lire des valeurs (méthode get) 5. En sortie du context manager, vérifie que toutes les clés obligatoires ont une valeur
La méthode add_rule(cle, validateur, obligatoire=False) prend : clé : le nom de la cle validateur : une fonction qui prend la valeur et renvoie True/False obligatoire : si True, la clé doit avoir une valeur a la sortie du with
La méthode set(cle, valeur) stocke la valeur si elle passe la validation. Si pas de regle pour cette clé, toute valeur est acceptee. Si la validation echoue, leve ValueError.
La méthode get(cle, défaut=None) renvoie la valeur ou le défaut.
__exit__ doit lever ValueError si des clés obligatoires n'ont pas de valeur.
Exemple : r = ValidatedRegistry() with r: r.add_rule('age', lambda v: isinstance(v, int) and v > 0) r.set('age', 25) # ok r.set('nom', 'Alice') # ok (pas de regle) r.get('age') donne 25
Tests (4/5)
Set et get basique
r = ValidatedRegistry()
with r:
r.set('nom', 'Alice')
assert r.get('nom') == 'Alice'
Validation reussie
r = ValidatedRegistry()
with r:
r.add_rule('age', lambda v: isinstance(v, int) and v > 0)
r.set('age', 25)
assert r.get('age') == 25
Validation echouee
r = ValidatedRegistry()
with r:
r.add_rule('age', lambda v: isinstance(v, int) and v > 0)
try:
r.set('age', -5)
assert False, 'Devrait lever ValueError'
except ValueError:
pass
Cle obligatoire manquante
r = ValidatedRegistry()
try:
with r:
r.add_rule('email', lambda v: '@' in v, obligatoire=True)
assert False, 'Devrait lever ValueError'
except ValueError:
pass
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
class ValidatedRegistry:
def __init__(self):
self._data = {}
self._rules = {}
self._required = set()
def add_rule(self, clé, validateur, obligatoire=False):
self._rules[cle] = validateur
if obligatoire:
self._required.add(cle)
def set(self, clé, valeur):
if clé in self._rules:
if not self._rules[cle](valeur):
raise ValueError(f'Validation echouee pour {cle}')
self._data[cle] = valeur
def get(self, clé, défaut=None):
return self._data.get(cle, défaut)
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type is not None:
return False
manquantes = self._required - set(self._data.keys())
if manquantes:
raise ValueError(f'Cles obligatoires manquantes: {manquantes}')
return False