0Pricing
Python Academy · Lektion

Praxisnahe Muster für Kontextmanager

Setzen Sie Kontextmanager für Dateien, Sperren, Zeitgeber und Datenbankverbindungen ein.

Praxisnahe Muster für Kontextmanager ist eine kostenlose Python Academy-Lektion auf CoddyKit. Dies ist Lektion 4 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.

Einführung

Kontextmanager lösen reale Probleme bei der Ressourcenverwaltung in Dateien, Datenbanken, Sperren, Timern und vielen weiteren Bereichen auf elegante Weise.

Dateiverarbeitungspipeline

Öffnen Sie Eingabe- und Ausgabedateien gemeinsam, verarbeiten Sie sie zeilenweise und schließen Sie beide automatisch.
import io
src = io.StringIO('line1\nline2\nline3')
dst = io.StringIO()
with src, dst:
    for line in src:
        dst.write(line.upper())
print(dst.getvalue())

Datenbanktransaktion

Umschließen Sie DB-Operationen mit einem CM: Bei Erfolg wird ein Commit ausgeführt, bei einer Ausnahme ein Rollback, und die Verbindung wird immer geschlossen.
from contextlib import contextmanager
@contextmanager
def db_transaction(conn):
    try:
        yield conn
        print('COMMIT')
    except Exception as e:
        print(f'ROLLBACK: {e}')
        raise
    finally:
        print('CLOSE')
with db_transaction({'execute': lambda q: print(f'SQL: {q}')}) as db:
    db['execute']('INSERT ...')

Threading-Sperre

with lock: Die Sperre wird erworben, der Block ausgeführt und beim Verlassen freigegeben – ein manuelles acquire/release ist nicht erforderlich.
import threading
lock = threading.Lock()
shared = []
def add(x):
    with lock:
        shared.append(x)
add(1); add(2)
print(shared)

Arbeitsverzeichnis ändern

os.chdir() ändert das globale Arbeitsverzeichnis. Ein CM speichert es und stellt es anschließend wieder her.
from contextlib import contextmanager
import os
@contextmanager
def chdir(path):
    old = os.getcwd()
    os.chdir(path)
    try: yield
    finally: os.chdir(old)
original = os.getcwd()
with chdir('/tmp'):
    print('in tmp:', os.getcwd())
print('back:', os.getcwd())

Temporäre Dateien

tempfile.NamedTemporaryFile als CM erstellt und löscht eine temporäre Datei automatisch.
import tempfile
with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=True) as f:
    f.write('temp data')
    print('temp file:', f.name)
print('deleted')

Umgebungsvariable vorübergehend ändern

Setzen Sie eine Umgebungsvariable vorübergehend für einen Test oder Subprozess und stellen Sie sie anschließend wieder her.
from contextlib import contextmanager
import os
@contextmanager
def env(**kwargs):
    old = {k: os.environ.get(k) for k in kwargs}
    os.environ.update({k:str(v) for k,v in kwargs.items()})
    try: yield
    finally:
        for k,v in old.items():
            if v is None: os.environ.pop(k,None)
            else: os.environ[k]=v
with env(DEBUG='1', LOG_LEVEL='DEBUG'):
    print(os.environ['DEBUG'])

Codeblock profilieren

Umschließen Sie einen Block mit cProfile, um seine Leistung innerhalb eines CM zu messen.
from contextlib import contextmanager
import cProfile
@contextmanager
def profile():
    pr = cProfile.Profile()
    pr.enable()
    yield pr
    pr.disable()
with profile() as pr:
    sum(range(1000000))
print('profiled')

Netzwerk-Socket

Sockets implementieren das CM-Protokoll: with socket.socket() as s: Beim Verlassen wird der Socket geschlossen.
import socket
try:
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.settimeout(0.1)
        print('socket ready')
except Exception as e:
    print(f'socket: {e}')

Warnungen erfassen

warnings.catch_warnings() erfasst Warnungen, die innerhalb des Blocks ausgegeben werden, und ist daher für Tests nützlich.
import warnings
with warnings.catch_warnings(record=True) as w:
    warnings.simplefilter('always')
    warnings.warn('test warning')
print(len(w), w[0].category.__name__)

Muster kombinieren

In der Praxis kombinieren CMs oft mehrere Muster: Transaktion, Protokollierung und Zeitmessung in einer wiederverwendbaren Komponente.
from contextlib import contextmanager
import time
@contextmanager
def timed_operation(name):
    print(f'[{name}] start')
    t0 = time.perf_counter()
    try:
        yield
        print(f'[{name}] done in {time.perf_counter()-t0:.4f}s')
    except Exception as e:
        print(f'[{name}] failed: {e}')
        raise
with timed_operation('loop'):
    sum(range(100000))

Kurzer Test

Welche Threading-Primitiv implementiert das Kontextmanager-Protokoll für einen sicheren nebenläufigen Zugriff?

Zusammenfassung

Muster für Kontextmanager: Dateipipelines, DB-Transaktionen, Sperren, Verzeichnisänderungen, temporäre Dateien, Änderungen an Umgebungsvariablen und Profiling. Für dynamische Ressourcenstapel steht ExitStack zur Verfügung.

Weiter

Sehr gute Arbeit! Die nächste Lektion wartet bereits.

Häufig gestellte Fragen

Ist die Lektion „Praxisnahe Muster für Kontextmanager“ kostenlos?

Ja — der vollständige Text von „Praxisnahe Muster für Kontextmanager“ 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 „Praxisnahe Muster für Kontextmanager“?

Setzen Sie Kontextmanager für Dateien, Sperren, Zeitgeber und Datenbankverbindungen ein. 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 4 von 4.

Wie lange dauert die Lektion „Praxisnahe Muster für Kontextmanager“?

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