CodeBlanks Logo Icon CodeBlanks

@contextmanager

@contextmanager ile decorator tabanlı context manager'ı öğrenirsin.

@contextmanager

@contextmanager dekoratörü bir fonksiyonu context manager'a dönüştürür. Sınıf yazmaya gerek yoktur; tek yield ile açılış ve kapanış ayrılır:

from contextlib import contextmanager

@contextmanager
def blok():
    print("başla")
    yield
    print("bitir")

with blok():
    print("içeride")

yield'tan önceki kod __enter__, sonraki kod __exit__ görevi görür. Bu, sınıf yazmaktan daha kısadır.

contextlib modülü standart kütüphanededir.

yield ve değer gönderme

yield bir değer de döndürebilir. Bu değer as ile yakalanır:

@contextmanager
def kaynak():
    print("aç")
    yield "veri"
    print("kapat")

with kaynak() as r:
    print(r)  # veri

Burada yield "veri" as r ile r'ye bağlanır. yield'in döndürdüğü değer, with bloğunda kullanılır.

Bu, sınıf tabanlı __enter__'in return değerine karşılık gelir.

Uygulama @contextmanager ile blok yaz

from contextlib import contextmanager yaz. @contextmanager ile def blok(): tanımla. Gövdede print("başla"), yield, print("bitir") yaz. Sonra with blok(): içinde print("içeride") yaz.

Başlangıç kodu

main.py
# contextlib'den contextmanager al
# blok fonksiyonunu context manager yap

Örnek çözüm

main.py
from contextlib import contextmanager

@contextmanager
def blok():
    print("başla")
    yield
    print("bitir")

with blok():
    print("içeride")

Beklenen çıktı

başla
içeride
bitir

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 @contextmanager eşleştir

Kavram Anlamı
@contextmanager Dekoratör
yield Bölüm noktası
yield öncesi __enter__
yield sonrası __exit__

2 @contextmanager'da yield ne işe yarar?

  • Açılış ve kapanışı ayırır Doğru cevap
  • Bloğu durdurur
  • Hata fırlatır
  • Değişken siler

Açıklama: yield'ten önceki kod açılış, sonraki kod kapanıştır.

3 yield anahtar sözcüğünü tamamla

Soru
@contextmanager
def blok():
    print("başla")
    ____
    print("bitir")
Cevap
@contextmanager
def blok():
    print("başla")
    yield
    print("bitir")

Açıklama: yield açılış ve kapanışı ayırır.

Orta seviye bölümündeki tüm dersler