Python : with et les gestionnaires de contexte

De Justine's wiki
(Redirigé depuis Python : Context Manager)
Aller à la navigation Aller à la recherche

Les informations sont issues de : http://sametmax.com/les-context-managers-et-le-mot-cle-with-en-python/

Sans context manager

Les context manager passent par le mot-clef with. Ce mot-clef agit un peu comme un décorateur : il permet d'exécuter du code automatiquement avant et après un autre code. De la même façon qu'avec les décorateurs, on pourrait faire tout ça sans utiliser le mot-clef with, il s'agit surtout d'une question de praticité (Sam parle même d"une question de style"!).

Je vais reprendre l'exemple de Sam :

def truc():
    print "machin"
 
print "Avant"
try:
    truc()
finally:
    print "Après"

Ici, même si je fais en sorte que ma fonction truc lève une exception, "Après" sera quand même affiché, malgré le plantage.

Avec les context managers

Un context manager est une classe ordinaire, sa spécifité est l'utilisation d'une méthode __enter__() et d'une méthode __exit__(); ce sont des méthodes normales, leur nom est juste une convention (qu'il convient de respecter!).

class monContextManager(object):
    
    def __enter__(self):
        print("Avant")
    
    def __exit__(self, type, value, traceback):
        print("Après")

def truc():
    print("Coucou !")

with monContextManager:
    truc()

 

 Pour une raison que j'ignore, cela ne fonctionne pas, mais c'est juste pour illustrer : le mot-clef with sert à englober des instructions dans un gestionnaire de contexte. C'est plus ou moins la même chose qu'un try/finally, en plus lisible. Je prend un morceau de code, je l'imbrique au milieu et j'exécute le tout.