Exercices Architecture & Patterns Context manager avec un générateur
🎉

Bravo!

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

@contextmanager
def mon_contexte():
print('debut')
yield 'valeur'
print('fin')

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.py