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():
passasynccontextmanager
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()) # capturedKurzer 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
- Die with-Anweisung im Detail
- Das __enter__- und __exit__-Protokoll
- contextlib: @contextmanager
- Praxisnahe Muster für Kontextmanager