Intermédiaire
🧠 Fondamentaux
20 XP
0 personnes ont réussi
Context manager avec un générateur
Écrire une classe avec __enter__ et __exit__ peut etre un peu lourd pour des cas simples. Python propose un raccourci avec le decorateur contextmanager du module contextlib.
L'idee est simple : tu ecris une fonction générateur (avec yield). Tout ce qui est avant le yield correspond a __enter__, et tout ce qui est apres correspond a __exit__.
Par exemple : from contextlib import contextmanager
with mon_contexte() as v: print(v) # affiche 'valeur'
Affiche : debut, valeur, fin
Écris un context manager appele compteur_operations() qui compte le nombre d'opérations ajoutees a une liste. Le yield renvoie un dictionnaire {'opérations': [], 'total': 0}. A la sortie du with, le dictionnaire est mis a jour avec le total.
Exemple : with compteur_operations() as c: c['opérations'].append('ajout') c['opérations'].append('modif') c['total'] donne 2
Tests (4/4)
Compteur basique
with compteur_operations() as c:
c['opérations'].append('a')
c['opérations'].append('b')
assert c['total'] == 2
Zero opérations
with compteur_operations() as c:
pass
assert c['total'] == 0
Trois opérations
with compteur_operations() as c:
c['opérations'].append(1)
c['opérations'].append(2)
c['opérations'].append(3)
assert c['total'] == 3
Opérations conservees
with compteur_operations() as c:
c['opérations'].append('x')
assert c['opérations'] == ['x']
Indices (3 disponibles)
Solution officielle
from contextlib import contextmanager
@contextmanager
def compteur_operations():
c = {'opérations': [], 'total': 0}
yield c
c['total'] = len(c['opérations'])