Verwalten Sie mehrere Kontextmanager zusammen mit Python contextlib.ExitStack

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.

Überprüfen Sie die Funktionsweise der Push-Methode und der enter_context-Methode

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__()

Praktisches Beispiel: Öffnen Sie alle Dateien im Verzeichnis mit der integrierten Funktion "Öffnen" und verwalten Sie sie mit "ExitStack".

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.

Verwandte Informationen

[^ cm]: Kontextmanager: Ein Objekt, das die Methoden __enter__ und __exit__ implementiert. Referenz: Offizielles Dokument.

Recommended Posts

Verwalten Sie mehrere Kontextmanager zusammen mit Python contextlib.ExitStack
Verwalten Sie mehrere Python-Versionen mit Update-Alternativen (Ubuntu)
Verwalten Sie die Python-Umgebung mit mehreren Versionen mit Pythonz, virtualenv
Verwalten Sie die Python-Umgebung mit virtualenv
[Paketwolke] Verwalten Sie Python-Pakete mit der Paketwolke
Veröffentlichen Sie mehrere Twitter-Bilder mit Python
Animieren Sie mehrere Standbilder mit Python
Verwalten Sie jede Python-Version mit Homebrew
Mehrfachintegration mit Python und Sympy
[Python] Erstellen mehrerer Fenster mit Tkinter
Verwalten Sie mehrere Ausführungsumgebungen mit Python venv
Verarbeiten Sie mehrere Listen mit for in Python
Frage: Die Mehrfachintegration mit Python funktioniert nicht
Sie können überlappende Zeichen mit mehreren plt.texts verwalten.
Verwenden Sie mit pyenv mehrere Versionen der Python-Umgebung
Entwickelt und verifiziert mit mehreren Python-Versionen mit direnv
Verwalten Sie AWS mit der Python-Bibliothek Boto
[Python] Umgang mit mehreren Aufruffehlern in ray.init
Konvertieren Sie mehrere Protodateien gleichzeitig mit Python
[Python] Erwähnen Sie mit der Slack-API mehrere Personen
FizzBuzz in Python3
Scraping mit Python
Statistik mit Python
Scraping mit Python
Twilio mit Python
In Python integrieren
Spielen Sie mit 2016-Python
AES256 mit Python
Python beginnt mit ()
Bingo mit Python
Zundokokiyoshi mit Python
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
Schreiben Sie mit Lambda (Python, JavaScript) mehrere Datensätze in DynamoDB.
Entfernen Sie Überschriften aus CSV-Dateien mit mehreren Formaten mit Python