Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Erstellen Benutzerdefinierter Kontextmanager | Advanced File Handling & Context Managers
Python Fortgeschrittene Konzepte

Erstellen Benutzerdefinierter Kontextmanager

Swipe um das Menü anzuzeigen

Um die volle Leistungsfähigkeit von Context Managern in Python auszuschöpfen, kann eine eigene Klasse erstellt werden, die die Methoden __enter__ und __exit__ implementiert. Die Methode __enter__ wird aufgerufen, wenn die Ausführung in den Kontext des with-Statements eintritt, und ihr Rückgabewert wird der Variablen nach as zugewiesen. Die Methode __exit__ wird aufgerufen, wenn die Ausführung den Kontext verlässt, unabhängig davon, ob dies regulär oder aufgrund einer Ausnahme geschieht. Dieses Design ermöglicht es, Ressourcen sicher und vorhersehbar einzurichten und wieder freizugeben, was besonders beim Umgang mit Dateien, Netzwerkverbindungen oder Sperren nützlich ist.

Die Methode __exit__ erhält drei Argumente: exc_type, exc_value und traceback. Diese liefern Details zu einer eventuell im Kontextblock aufgetretenen Ausnahme. Gibt __exit__ True zurück, wird die Ausnahme unterdrückt; andernfalls wird die Ausnahme nach der Bereinigung weitergegeben. Durch die Implementierung dieser Methoden kann die Logik für das Einrichten und Aufräumen von Ressourcen präzise gesteuert werden, was den Code robuster und wartbarer macht.

class FileLogger:
    def __init__(self, filename, logname):
        self.filename = filename
        self.logname = logname
        self.file = None
        self.log = None

    def __enter__(self):
        self.file = open(self.filename, "r")
        self.log = open(self.logname, "a")
        self.log.write(f"Opened file: {self.filename}\n")
        return self.file

    def __exit__(self, exc_type, exc_value, traceback):
        if self.file:
            self.file.close()
            self.log.write(f"Closed file: {self.filename}\n")
        if self.log:
            self.log.close()
        # Do not suppress exceptions
        return False

Der folgende Code demonstriert eine benutzerdefinierte Context-Manager-Klasse FileLogger. Diese Klasse ist dafür konzipiert, eine Zieldatei zum Lesen und eine Logdatei zum Anhängen von Logeinträgen zu öffnen. Beim Eintritt in den Kontext (mittels with-Statement) wird das Öffnen der Datei protokolliert. Beim Verlassen des Kontexts – unabhängig davon, ob dies regulär oder durch eine Ausnahme geschieht – wird das Schließen der Datei protokolliert und sichergestellt, dass beide Dateien ordnungsgemäß geschlossen werden. Die Methode __exit__ unterdrückt keine Ausnahmen, sodass diese nach der Bereinigung weitergegeben werden.

question mark

Welche Aussage beschreibt die Rolle der Methode __exit__ in einem benutzerdefinierten Context Manager am besten?

Wählen Sie die richtige Antwort aus

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 5

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Abschnitt 2. Kapitel 5
some-alt