@contextmanager
- Python kursu
- Orta seviye
- Ders 108/116
- 5 dk
@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) # veriBurada 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
# contextlib'den contextmanager al
# blok fonksiyonunu context manager yapÖrnek çözüm
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
@contextmanager
def blok():
print("başla")
____
print("bitir")
@contextmanager
def blok():
print("başla")
yield
print("bitir")
Açıklama: yield açılış ve kapanışı ayırır.