0Pricing
Python Academy · Lektion

contextlib: @contextmanager

Erstellen Sie mit dem contextlib-Decorator kompakte Kontextmanager.

contextlib: @contextmanager ist eine kostenlose Python Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Python Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum contextlib?

Mit contextlib.contextmanager können Sie einen Kontextmanager als Generatorfunktion statt als Klasse schreiben und dadurch Boilerplate-Code reduzieren.

from contextlib import contextmanager

@contextmanager
def managed():
    print("setup")
    yield
    print("teardown")

with managed():
    print("inside")

Einen Wert liefern

Alles, was Sie mit yield liefern, wird an die as-Variable in der with-Anweisung gebunden.

from contextlib import contextmanager

@contextmanager
def temp_list():
    lst = []
    yield lst
    print(f"Final list: {lst}")

with temp_list() as lst:
    lst.append(1)
    lst.append(2)

Ausnahmen in @contextmanager behandeln

Umschließen Sie yield mit try/finally, um die Bereinigung auch beim Auftreten einer Ausnahme zu garantieren.

from contextlib import contextmanager

@contextmanager
def safe_open(path):
    f = open(path)
    try:
        yield f
    finally:
        f.close()

with safe_open("data.txt") as f:
    print(f.read())

Ausnahmen unterdrücken

Fangen Sie die Ausnahme innerhalb des Generators ab, um sie zu unterdrücken – das entspricht der Rückgabe von True aus __exit__.

from contextlib import contextmanager

@contextmanager
def ignore_value_errors():
    try:
        yield
    except ValueError:
        pass

with ignore_value_errors():
    raise ValueError("ignored")

contextlib.suppress

contextlib.suppress(*exceptions) ist ein fertiger Kontextmanager, der angegebene Ausnahmetypen unterdrückt.

from contextlib import suppress

with suppress(FileNotFoundError):
    open("missing.txt")

print("continues")

contextlib.closing

closing(obj) erstellt einen Kontextmanager, der beim Verlassen obj.close() aufruft. Nützlich für Objekte mit close(), aber ohne __exit__.

from contextlib import closing
from urllib.request import urlopen

with closing(urlopen("https://example.com")) as page:
    content = page.read()

contextlib.nullcontext

nullcontext ist ein Kontextmanager ohne Funktion. Nützlich, wenn ein Kontextmanager optional ist.

from contextlib import nullcontext

def process(data, lock=None):
    cm = lock if lock is not None else nullcontext()
    with cm:
        return [x*2 for x in data]

contextlib.ExitStack

Mit ExitStack können Sie dynamisch eine variable Anzahl von Kontextmanagern verwalten.

from contextlib import ExitStack

files = ["a.txt", "b.txt", "c.txt"]
with ExitStack() as stack:
    handles = [stack.enter_context(open(f)) for f in files]
    data = [h.read() for h in handles]

@contextmanager wiederverwenden

Ein generatorbasierter Kontextmanager kann pro Aufruf nur einmal verwendet werden. Rufen Sie die dekorierte Funktion erneut auf, um ihn wiederzuverwenden.

from contextlib import contextmanager

@contextmanager
def counter():
    count = 0
    yield lambda: count.__add__  # each call is independent
    print("done")

with counter():
    pass
with counter():
    pass

asynccontextmanager

Für asynchronen Code verwenden Sie contextlib.asynccontextmanager, um async with-Manager als Generatoren zu schreiben.

from contextlib import asynccontextmanager

@asynccontextmanager
async def async_session():
    session = await create_session()
    try:
        yield session
    finally:
        await session.close()

contextlib.redirect_stdout

Leiten Sie die Standardausgabe vorübergehend auf ein beliebiges dateiähnliches Objekt um.

import io
from contextlib import redirect_stdout

buf = io.StringIO()
with redirect_stdout(buf):
    print("captured")

print(buf.getvalue())  # captured

Kurzer Test

Wo sollte in einem @contextmanager-Generator der Bereinigungscode platziert werden, damit seine Ausführung auch bei einer Ausnahme garantiert ist?

Zusammenfassung

@contextmanager macht aus einem Generator einen Kontextmanager. Verwenden Sie try/finally um yield, um eine sichere Bereinigung zu gewährleisten. Das contextlib-Modul stellt außerdem suppress, nullcontext, ExitStack und weitere Funktionen bereit.

Häufig gestellte Fragen

Ist die Lektion „contextlib: @contextmanager“ kostenlos?

Ja — der vollständige Text von „contextlib: @contextmanager“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Python Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „contextlib: @contextmanager“?

Erstellen Sie mit dem contextlib-Decorator kompakte Kontextmanager. Du übst Python Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Python Academy zu starten?

Keine Vorkenntnisse erforderlich. Python Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „contextlib: @contextmanager“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Python Academy-Lektion Code schreiben und ausführen?

Ja. Jede Python Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Die with-Anweisung im Detail
  2. Das __enter__- und __exit__-Protokoll
  3. contextlib: @contextmanager
  4. Praxisnahe Muster für Kontextmanager
← Zurück zu Python Academy