Gérez plusieurs gestionnaires de contexte avec Python contextlib.

Vous pouvez gérer plusieurs gestionnaires de contexte [^ cm] à la fois en utilisant la classe contextlib.ExitStack de la bibliothèque standard Python. Les avantages de la classe ExitStack sont répertoriés ci-dessous.

Confirmation du fonctionnement de la méthode push et de la méthode ʻenter_context`

La méthode push n'appelle pas la méthode gérée __enter__, et la méthode ʻenter_context appelle la méthode managéeenter. Normalement, utiliser la méthode ʻenter_context convient.

from contextlib import ExitStack


class TestClass:
    def __init__(self):
        print("TestClass.__init__()")

    def __enter__(self):
        print("TestClass.__enter__()")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print("TestClass.__exit__()")


with ExitStack() as stack:
    stack.push(TestClass())
    # TestClass.__init__()
    # TestClass.__exit__()

with ExitStack() as stack:
    stack.enter_context(TestClass())
    # TestClass.__init__()
    # TestClass.__enter__()
    # TestClass.__exit__()

Exemple pratique: Ouvrez tous les fichiers du répertoire avec la fonction intégrée ʻopen et gérez-les avec ʻExitStack.

Il n'est pas souvent utilisé en raison du problème de gestion des ressources de handle, mais vous pouvez ouvrir et gérer les fichiers dans le répertoire à la fois en combinant les instructions ʻExitStack et with`.

import os
from contextlib import ExitStack
from typing import List, BinaryIO

#Créez / démarrez un objet ExitStack avec l'instruction with.
with ExitStack() as stack:
    #Récupère le chemin du fichier dans le répertoire courant.
    #Excluez les répertoires car la fonction intégrée ouverte échouera.
    paths: List[str] = [path for path in os.listdir(".") if os.path.isfile(path)]

    #Ouvrez tout en ajoutant le fichier à ExitStack.
    files: List[BinaryIO] = [stack.enter_context(open(path, "rb")) for path in paths]

    #Traitez le fichier ouvert de manière appropriée.
    file: BinaryIO
    for file in files:
        print(",".join([hex(byte).ljust(2, "0") for byte in file.read(5)]))

#Le gestionnaire de contexte enregistré dans l'objet ExitStack (pile)
#Publié à la fin de la déclaration with.

Informations connexes

[^ cm]: Gestionnaire de contexte: un objet qui implémente les méthodes __enter__ et __exit__. Référence: Document officiel.

Recommended Posts

Gérez plusieurs gestionnaires de contexte avec Python contextlib.
Gérez plusieurs versions de Python avec des alternatives de mise à jour (Ubuntu)
Gérez l'environnement de plusieurs versions de Python avec Pythonz, virtualenv
Gérez l'environnement python avec virtualenv
[Package cloud] Gérez les packages python avec le package cloud
Publiez plusieurs images Twitter avec python
Animez plusieurs images fixes avec Python
Gérez chaque version de Python avec Homebrew
Intégration multiple avec Python et Sympy
[Python] Création de plusieurs fenêtres avec Tkinter
Gérez plusieurs environnements d'exécution à l'aide de Python venv
Traiter plusieurs listes avec for en Python
Question: l'intégration multiple par python ne fonctionne pas
Vous pouvez gérer les caractères qui se chevauchent avec plusieurs plt.text.
Utiliser plusieurs versions de l'environnement python avec pyenv
Développé et vérifié avec plusieurs versions de python avec direnv
Gérez bien AWS avec la bibliothèque Python Boto
[Python] Traitement de plusieurs erreurs d'appel dans ray.init
Convertissez plusieurs fichiers proto à la fois avec python
[Python] Mention à plusieurs personnes avec l'API de Slack
FizzBuzz en Python3
Grattage avec Python
Statistiques avec python
Grattage avec Python
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
python commence par ()
Bingo avec python
Zundokokiyoshi avec python
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
Écrire plusieurs enregistrements dans DynamoDB avec Lambda (Python, JavaScript)
Supprimer les en-têtes de fichiers CSV à plusieurs formats avec python