Avancé
🧠 Fondamentaux
30 XP
0 personnes ont réussi
E-commerce #8 : Panier avec context manager
On peut transformer le Panier en context manager pour gerer une session d'achat. L'idee : quand on entre dans le bloc with, le panier est vide (nouvelle session). Si une erreur se produit pendant la session, le panier est annule (vide a nouveau). Si tout se passe bien, le panier est conserve.
C'est comme une transaction en base de données : soit tout passe, soit on annule tout.
Crée les méthodes __enter__ et __exit__ sur la classe Panier : - __enter__ : vide le panier (self.items = {}) et retourne self - __exit__ : si une exception s'est produite (exc_type n'est pas None), vide le panier. Retourne False pour laisser les exceptions se propager.
Exemple : with Panier() as panier: panier.ajouter(produit) # Si exception ici : panier vide # Sinon : panier conserve
Tests (2/4)
Entrée dans le with
from decimal import Decimal
p = Produit('A', Decimal('10'))
pan = Panier()
pan.ajouter(p)
with pan as p2:
assert len(p2.items) == 0
Panier conserve sans erreur
from decimal import Decimal
prod = Produit('B', Decimal('5'))
with Panier() as pan:
pan.ajouter(prod, 2)
assert len(pan.items) == 1
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
from decimal import Decimal
class Produit:
def __init__(self, nom, prix):
self.nom = nom
self.prix = Decimal(str(prix))
def __hash__(self): return hash(self.nom)
def __eq__(self, o): return isinstance(o, Produit) and self.nom == o.nom
class Panier:
def __init__(self):
self.items = {}
def ajouter(self, produit, quantite=1):
self.items[produit] = self.items.get(produit, 0) + quantite
def total(self):
return sum(p.prix * q for p, q in self.items.items())
def __enter__(self):
self.items = {}
return self
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type is not None:
self.items = {}
return False