Sie können mehrere Kontextmanager [^ cm] gleichzeitig verwalten, indem Sie die Python-Standardbibliothek contextlib.ExitStack-Klasse verwenden. Die Vorteile der ExitStack-Klasse sind unten aufgeführt.
__init__
. Kann gemeinsam verwaltet werden.Die "push" -Methode ruft nicht die verwaltete "enter" -Methode auf, und die "enter_context" -Methode ruft die verwaltete "enter" -Methode auf. Normalerweise ist die Verwendung der Methode "enter_context" in Ordnung.
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__()
Es wird aufgrund des Problems der Ressourcenverwaltung nicht häufig verwendet, aber Sie können die Dateien im Verzeichnis sofort öffnen und verwalten, indem Sie die Anweisungen ExitStack
und with
kombinieren.
import os
from contextlib import ExitStack
from typing import List, BinaryIO
#Erstellen / starten Sie ein ExitStack-Objekt mit der with-Anweisung.
with ExitStack() as stack:
#Rufen Sie den Pfad der Datei im aktuellen Verzeichnis ab.
#Schließen Sie Verzeichnisse aus, da die offene integrierte Funktion fehlschlägt.
paths: List[str] = [path for path in os.listdir(".") if os.path.isfile(path)]
#Öffnen Sie diese, während Sie die Datei zu ExitStack hinzufügen.
files: List[BinaryIO] = [stack.enter_context(open(path, "rb")) for path in paths]
#Verarbeiten Sie die geöffnete Datei entsprechend.
file: BinaryIO
for file in files:
print(",".join([hex(byte).ljust(2, "0") for byte in file.read(5)]))
#Der im ExitStack-Objekt (Stack) registrierte Kontextmanager
#Veröffentlicht am Ende der with-Anweisung.
contextlib.AsyncExitStack
verwenden.[^ cm]: Kontextmanager: Ein Objekt, das die Methoden __enter__
und __exit__
implementiert. Referenz: Offizielles Dokument.
Recommended Posts