Python Context Manager

Obwohl Python-Kontextmanager weit verbreitet sind, verstehen nur wenige den Zweck hinter ihrer Verwendung. Diese Anweisungen, die üblicherweise beim Lesen und Schreiben von Dateien verwendet werden, helfen der Anwendung, Systemspeicher zu schonen und die Ressourcenverwaltung zu verbessern, indem sichergestellt wird, dass bestimmte Ressourcen nur für bestimmte Prozesse verwendet werden.

Die with-Anweisung

Ein Kontextmanager ist ein Objekt, das benachrichtigt wird, wenn ein Kontext (ein Codeblock) beginnt und endet. Man verwendet ihn üblicherweise mit der with-Anweisung. Diese kümmert sich um die Benachrichtigung.

Zum Beispiel sind Datei-Objekte Kontextmanager. Wenn ein Kontext endet, wird das Datei-Objekt automatisch geschlossen:

# Kontextmanager: kümmert sich automatisch um die Ressourcenbereinigung
# Die Datei wird automatisch geschlossen, wenn der 'with'-Block verlassen wird
with open(filename) as f:  # 'f' ist das Datei-Objekt
    file_contents = f.read()

# Die Datei ist hier automatisch geschlossen, auch wenn ein Fehler aufgetreten ist
Quiz

Melden Sie sich an, um dieses Quiz zu beantworten und Ihren Lernfortschritt zu verfolgen

Was ist der Hauptvorteil der Verwendung eines Kontextmanagers (der with-Anweisung)?
A. Automatische Bereinigung von Ressourcen, auch wenn ein Fehler auftritt
B. Lässt Code schneller ausführen
C. Ermöglicht das gleichzeitige Öffnen mehrerer Dateien
D. Verhindert alle Fehler

Alles, was die Ausführung des Blocks beendet, führt dazu, dass die Exit-Methode des Kontextmanagers aufgerufen wird. Dies schließt Ausnahmen ein und kann nützlich sein, wenn ein Fehler dazu führt, dass Sie vorzeitig eine geöffnete Datei oder Verbindung verlassen. Ein Skript zu beenden, ohne Dateien/Verbindungen ordnungsgemäß zu schließen, ist eine schlechte Idee, die zu Datenverlust oder anderen Problemen führen kann. Durch die Verwendung eines Kontextmanagers können Sie sicherstellen, dass Vorkehrungen immer getroffen werden, um auf diese Weise Schäden oder Verluste zu verhindern.

Schreiben Ihres eigenen Kontextmanagers

Es ist auch möglich, einen Kontextmanager mithilfe der Generator-Syntax dank des Decorators contextlib.contextmanager zu schreiben:

# Funktionsbasierter Kontextmanager unter Verwendung des contextlib-Decorators
import contextlib
@contextlib.contextmanager
def context_manager(num):
    print('Enter')  # Code vor yield wird bei __enter__ ausgeführt
    yield num + 1   # Der übergebene Wert wird zur 'cm'-Variable
    print('Exit')    # Code nach yield wird bei __exit__ ausgeführt

with context_manager(2) as cm:  # cm empfängt den übergebenen Wert (3)
    print('Right in the middle with cm = {}'.format(cm))
Enter
Right in the middle with cm = 3
Exit

Klassenbasierter Kontextmanager

Sie können einen klassenbasierten Kontextmanager definieren. Die Schlüsselmethoden sind __enter__ und __exit__

# Klassenbasierter Kontextmanager: Implementieren Sie die Methoden __enter__ und __exit__
class ContextManager:
    def __enter__(self, *args, **kwargs):  # Wird beim Betreten des 'with'-Blocks aufgerufen
        print("--enter--")
        return self  # Kann ein Objekt zurückgeben, das als 'as'-Variable verwendet wird

    def __exit__(self, *args):  # Wird beim Verlassen des 'with'-Blocks aufgerufen
        print("--exit--")

with ContextManager():  # Ruft __enter__ auf, dann __exit__, wenn fertig
    print("test")
--enter--
test
--exit--
Quiz

Melden Sie sich an, um dieses Quiz zu beantworten und Ihren Lernfortschritt zu verfolgen

Welche Methoden muss eine Klasse implementieren, um als Kontextmanager verwendet werden zu können?
A. **init** und **del**
B. **enter** und **exit**
C. open und close
D. start und stop