Python Contextlib

Fariba Laiq 13 Juni 2022
  1. Verwendung von die with-Anweisung als Kontextmanager in Python
  2. Verwendung von den Function Decorator @contextmanager in Python
Python Contextlib

Manchmal verwenden wir einige Ressourcen wie eine Datei. Wir öffnen es und vergessen, es zu schließen, wenn wir mit der Arbeit fertig sind.

Es ist eine schlechte Programmierpraxis und verursacht Probleme, wenn zu viele Dateien geöffnet sind. Selbst wenn wir diese Ressourcen nicht mehr benötigen, kann das Programm sie auf unbestimmte Zeit erwerben.

Diese Situation verursacht Speicherverluste. Um diese Dinge automatisch zu handhaben, hat Python Kontextmanager.

Sie kümmern sich um die Verwaltung der Ressourcen. Die contextlib ist eine Python-Bibliothek, die Dienstprogramme für die Ressourcenverwaltung mit dem Schlüsselwort with bereitstellt.

Verwendung von die with-Anweisung als Kontextmanager in Python

In Python verwaltet die with-Anweisung Ressourcen und behandelt Ausnahmen. Es funktioniert also als Kontextmanager.

Wenn der Code eine with-Anweisung erreicht, weist er vorübergehend Ressourcen zu. Die zuvor erworbenen Ressourcen werden freigegeben, wenn der with-Anweisungsblock seine Ausführung beendet.

Im folgenden Code haben wir eine Datei erstellt und geöffnet. Die im with-Block erworbenen Ressourcen werden freigegeben, wenn die Kontrolle außerhalb des with-Blocks liegt.

Beispielcode:

with open("file.txt", "w+") as f:
    print("File Opened")

Ausgabe:

File Opened

Wir können auch die Kontextmanager-Funktionalität in unsere Programme integrieren. Dazu muss unsere Klasse die Methoden __enter__() und __exit__() haben.

Um den Ablauf des Kontextmanagers zu verstehen, haben wir den folgenden Code mit der Anweisung print ausgeführt, die ausgeführt wird, wenn die Steuerung an den jeweiligen Block übergeben wird.

Beispielcode:

class MyContextManager:
    def __init__(self):
        print("In init method")

    def __enter__(self):
        print("In enter method")

    def __exit__(self, exc_type, exc_value, exc_traceback):
        print("In exit method")


with MyContextManager() as m:
    print("With block")

Ausgabe:

In init method
In enter method
With block
In exit method

Verwendung von den Function Decorator @contextmanager in Python

Eine andere Methode, um eine Funktion als Kontextmanager zu erstellen, ist die Verwendung des Funktionsdekorators @contextmanager. Ein Decorator ist eine Funktion, die eine andere Funktion als Eingabe verwendet, ihre Funktionalität erweitert/ihr Verhalten ändert und eine andere Funktion als Ausgabe zurückgibt.

Wir müssen die separate Klasse oder die Funktionen __enter__() und __exit__() nicht schreiben, wenn wir diesen Decorator verwenden. Wir müssen den Kontextmanager aus dem Modul contextlib importieren.

Wir verwenden das @contextmanager über unserer Funktion. Das Schlüsselwort yield ist wie die return-Anweisung, die für die Rückgabe von Werten/Kontrollen verwendet wird.

Alles vor dem Schlüsselwort yield wird als Abschnitt __enter__ betrachtet, und alles nach dem Schlüsselwort yield wird als Abschnitt __exit__ betrachtet.

Beispielcode:

from contextlib import contextmanager


@contextmanager
def MyContextManager():
    print("In enter method")
    yield
    print("In exit method")


with MyContextManager() as m:
    print("With block")

Ausgabe:

In enter method
With block
In exit method
Fariba Laiq avatar Fariba Laiq avatar

I am Fariba Laiq from Pakistan. An android app developer, technical content writer, and coding instructor. Writing has always been one of my passions. I love to learn, implement and convey my knowledge to others.

LinkedIn