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.
__init__
. Peut être géré collectivement.__enter__
en utilisant correctement la méthode push
et la méthode ʻenter_context`.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ée
enter. 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__()
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.
contextlib.AsyncExitStack
.[^ cm]: Gestionnaire de contexte: un objet qui implémente les méthodes __enter__
et __exit__
. Référence: Document officiel.
Recommended Posts