Skip to content

Les context managers

Structure de base

class BasicContextManager:
    def __enter__(self):
        print("Entering Context Manager")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("Exiting Context Manager")

Usage :

with BasicContextManager():
    print('In context')

Un context manager reste un objet

Le contexte manager reste une classe et donc un objet. IL peut avoir une méthode __init__(self)

class BasicContextManager:
    def __init__(self):
        print("Initializing")
        self.my_id = "I'm the context"

    def __enter__(self):
        print("Entering Context Manager")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("Exiting Context Manager")
bc = BasicContextManager()
with bc:
    print(f'In context {bc.my_id}')

Idiome with as

Le mot clef as récupère le retour de la fonction __enter__(self).

class BasicContextManager:
    def __init__(self):
        print("Initializing")
        self.my_id = "I'm the context"

    def __enter__(self):
        print("Entering Context Manager")
        return self

Permet l'usage :

with BasicContextManager() as bc:
    print(f'In context {bc.my_id}')

Gestion des exceptions

Paramètres de __exit__()

Si une exception se produit dans le contexte et l’interrompt, elle peut être gérée dans la méthode __exit__(). Les paramètres de cette méthodes vont alors entrer en jeu. La signature complète de la méthode est __exit__(self, exc_type, exc_value, exc_tb). * exc_type : est le type (classe) de l’exception * exc_value : est l’instance de l’exception * exc_tb : est l’objet traceback

Attention, vous ne devez pas lever une exception dans ce bloc pour faire suivre l’exception.

Propagation de l'exception

Si vous avez géré l’exception et qu’elle ne doit pas être propagée, alors la méthode doit retourner une valeur vrai (truthy). Si la méthode retourne une valeur falsy (ce qui est fait par défaut puisque le retour est None), l’exception sera propagée.