Comment utiliser les gestionnaires de contexte en Python (avec instruction)

Découvrez comment fonctionnent les gestionnaires de contexte en Python. Maîtrisez l'instruction with, gérez les ressources système et écrivez des gestionnaires de contexte personnalisés.

Essayez cette solution dans l'éditeur

Aperçu

La gestion appropriée des ressources externes, telles que la fermeture des descripteurs de fichiers, la déconnexion des connexions à la base de données et la libération des verrous de thread, est essentielle pour créer un logiciel fiable et prêt pour la production. Ne pas libérer les ressources peut entraîner des fuites de mémoire, des erreurs de verrouillage de fichiers et des blocages d'applications.

L'instruction « with » de Python simplifie le nettoyage des ressources en créant un gestionnaire de contexte. Un gestionnaire de contexte garantit que les actions de nettoyage sont automatiquement exécutées lorsque le contrôle quitte le bloc, même si le code lève une exception ou se termine plus tôt. Cela élimine le besoin de blocs « try-finally » verbeux et répétitifs.

Bien que les gestionnaires de contexte soient le plus souvent associés à des opérations intégrées telles que « open() », vous pouvez facilement concevoir vos propres gestionnaires de contexte personnalisés. Vous pouvez les construire en créant une classe qui implémente les méthodes magiques `__enter__` et `__exit__`, ou en écrivant une fonction génératrice décorée avec le décorateur `contextlib.contextmanager`.

Sortie de code et d'exécution

Ce script montre l'écriture de gestionnaires de contexte personnalisés en Python à l'aide d'implémentations de classe et de décorateurs contextlib.

context_managers.py
Essayez dans l'éditeur
from contextlib import contextmanager

# Method 1: Class-based context manager
class CustomResource:
    def __enter__(self):
        print("[Resource] Opening connection...")
        return self

    def do_work(self):
        print("[Resource] Performing action...")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("[Resource] Closing connection safely.")
        return False

print("--- Class Context Manager ---")
with CustomResource() as resource:
    resource.do_work()

# Method 2: Generator-based context manager (contextlib)
@contextmanager
def simple_timer():
    print("\n[Timer] Started...")
    try:
        yield
    finally:
        print("[Timer] Finished!")

print("\n--- Decorator Context Manager ---")
with simple_timer():
    print("Performing tasks inside context...")
Sortie terminale
--- Class Context Manager ---
[Resource] Opening connection...
[Resource] Performing action...
[Resource] Closing connection safely.

--- Decorator Context Manager ---

[Timer] Started...
Performing tasks inside context...
[Timer] Finished!

Mise en œuvre étape par étape

  • Utilisez l'instruction with lors de l'ouverture de fichiers, de bases de données ou de verrous pour garantir la sécurité des ressources.
  • Définissez des gestionnaires de contexte personnalisés à l'aide de classes avec les méthodes magiques __enter__ et __exit__.
  • Utilisez le décorateur @contextlib.contextmanager sur une fonction génératrice comme alternative plus simple basée sur les fonctions.
  • Placez les actions de fermeture des ressources dans le bloc de nettoyage pour garantir qu'elles s'exécutent même si des erreurs se produisent.

Foire aux questions

Quels paramètres la méthode __exit__ reçoit-elle ?

La méthode __exit__ reçoit trois arguments représentant les détails de l'exception si une exception a été déclenchée : exc_type (type d'exception), exc_val (valeur de l'exception) et exc_tb (traceback). Si aucune erreur ne s'est produite, les trois sont transmises comme Aucune.

Un gestionnaire de contexte peut-il supprimer les exceptions ?

Oui. Si la méthode __exit__ renvoie une valeur véridique (comme True), Python supprime l'exception et l'exécution continue après le bloc with. S'il renvoie False, l'exception est déclenchée normalement.

Sujets connexes

Ressources Python recommandées

Développez vos connaissances avec des didacticiels interactifs, des aide-mémoire et des comparaisons de codes associés.