Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Création de gestionnaires de contexte personnalisés | Advanced File Handling & Context Managers
Concepts Avancés de Python

Création de gestionnaires de contexte personnalisés

Glissez pour afficher le menu

Pour exploiter pleinement la puissance des gestionnaires de contexte en Python, il est possible d’en créer un personnalisé en définissant une classe qui implémente les méthodes __enter__ et __exit__. La méthode __enter__ est appelée lorsque l’exécution entre dans le contexte de l’instruction with, et sa valeur de retour est assignée à la variable après as. La méthode __exit__ est invoquée lorsque l’exécution quitte le contexte, que ce soit normalement ou à la suite d’une exception. Cette conception permet de configurer et de libérer des ressources de manière sûre et prévisible, ce qui est particulièrement utile pour la gestion de fichiers, de connexions réseau ou de verrous.

La méthode __exit__ reçoit trois arguments : exc_type, exc_value et traceback. Ceux-ci fournissent des informations sur toute exception survenue dans le bloc de contexte. Si __exit__ retourne True, l’exception est supprimée ; sinon, l’exception sera propagée après le nettoyage. En implémentant ces méthodes, il est possible de contrôler précisément la logique d’initialisation et de nettoyage des ressources, rendant le code plus robuste et maintenable.

class FileLogger:
    def __init__(self, filename, logname):
        self.filename = filename
        self.logname = logname
        self.file = None
        self.log = None

    def __enter__(self):
        self.file = open(self.filename, "r")
        self.log = open(self.logname, "a")
        self.log.write(f"Opened file: {self.filename}\n")
        return self.file

    def __exit__(self, exc_type, exc_value, traceback):
        if self.file:
            self.file.close()
            self.log.write(f"Closed file: {self.filename}\n")
        if self.log:
            self.log.close()
        # Do not suppress exceptions
        return False

Le code suivant illustre une classe de gestionnaire de contexte personnalisée FileLogger. Cette classe est conçue pour ouvrir un fichier cible en lecture et un fichier de log en mode ajout. Lors de l’entrée dans le contexte (avec l’instruction with), elle consigne l’événement d’ouverture du fichier. Lors de la sortie du contexte – que ce soit à la suite d’une exécution normale ou d’une exception – elle consigne l’événement de fermeture du fichier et s’assure que les deux fichiers sont correctement fermés. La méthode __exit__ ne supprime pas les exceptions, permettant ainsi leur propagation après le nettoyage.

question mark

Quelle affirmation décrit le mieux le rôle de la méthode __exit__ dans un gestionnaire de contexte personnalisé ?

Sélectionnez la réponse correcte

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 2. Chapitre 5

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Section 2. Chapitre 5
some-alt