Python Language Ecrire votre propre gestionnaire de contexte


Exemple

Un gestionnaire de contexte est un objet qui implémente deux méthodes magiques __enter__() et __exit__() (bien qu’il puisse également implémenter d’autres méthodes):

class AContextManager():

    def __enter__(self):
        print("Entered")
        # optionally return an object
        return "A-instance"

    def __exit__(self, exc_type, exc_value, traceback):
        print("Exited" + (" (with an exception)" if exc_type else ""))
        # return True if you want to suppress the exception

Si le contexte sort avec une exception, les informations sur cette exception sera adoptée en tant que triple exc_type , exc_value , traceback (ce sont les mêmes variables que retournée par la sys.exc_info() fonction). Si le contexte se ferme normalement, ces trois arguments seront None .

Si une exception se produit et est transmise à la méthode __exit__ , la méthode peut renvoyer True afin de supprimer l'exception ou l'exception sera relancée à la fin de la fonction __exit__ .

with AContextManager() as a:
    print("a is %r" % a)
# Entered
# a is 'A-instance'
# Exited

with AContextManager() as a:
    print("a is %d" % a)
# Entered
# Exited (with an exception)
# Traceback (most recent call last):
#   File "<stdin>", line 2, in <module>
# TypeError: %d format: a number is required, not str

Notez que dans le deuxième exemple, même si une exception se produit au milieu du corps de l'instruction with-statement, le gestionnaire __exit__ toujours exécuté avant que l'exception ne se propage à la portée externe.

Si vous n'avez besoin que d'une méthode __exit__ , vous pouvez renvoyer l'instance du gestionnaire de contexte:

class MyContextManager:
    def __enter__(self):
        return self

    def __exit__(self):
        print('something')