contextlib: @contextmanager
contextlib dekoratörüyle kısa ve öz bağlam yöneticileri oluşturun.
contextlib: @contextmanager, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Python Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Python Academy kursu toplamda 4 dersten oluşur.
contextlib Neden Kullanılır?
contextlib.contextmanager, bir bağlam yöneticisini sınıf yerine üreteç işlevi olarak yazmanızı sağlar ve gereksiz kodu azaltır.
from contextlib import contextmanager
@contextmanager
def managed():
print("setup")
yield
print("teardown")
with managed():
print("inside")Değer Üretme
yield ile ürettiğiniz değer, with ifadesindeki as değişkenine atanır.
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)@contextmanager ile İstisna Yönetimi
Bir istisna oluşsa bile temizleme işleminin kesinlikle yapılmasını sağlamak için yield ifadesini try/finally içine alın.
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())İstisnaları Bastırma
İstisnayı bastırmak için onu üretecin içinde yakalayın — bu, __exit__ içinden True döndürmekle aynıdır.
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), belirtilen istisna türlerini bastıran, hazır bir bağlam yöneticisidir.
from contextlib import suppress
with suppress(FileNotFoundError):
open("missing.txt")
print("continues")contextlib.closing
closing(obj), çıkışta obj.close() çağıran bir bağlam yöneticisi oluşturur. close() özelliği olup __exit__ özelliği olmayan nesneler için kullanışlıdır.
from contextlib import closing
from urllib.request import urlopen
with closing(urlopen("https://example.com")) as page:
content = page.read()contextlib.nullcontext
nullcontext, hiçbir işlem yapmayan bir bağlam yöneticisidir. Bağlam yöneticisinin isteğe bağlı olduğu durumlarda kullanışlıdır.
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
ExitStack, değişken sayıda bağlam yöneticisini dinamik olarak yönetmenizi sağlar.
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'ı Yeniden Kullanma
Üreteç tabanlı bir bağlam yöneticisi her çağrıda yalnızca bir kez kullanılabilir. Yeniden kullanmak için dekorasyon uygulanmış işlevi tekrar çağırın.
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
Asenkron kod için, üreteçleri async with yöneticileri olarak yazmak üzere contextlib.asynccontextmanager kullanın.
from contextlib import asynccontextmanager
@asynccontextmanager
async def async_session():
session = await create_session()
try:
yield session
finally:
await session.close()contextlib.redirect_stdout
Standart çıktıyı geçici olarak dosya benzeri herhangi bir nesneye yönlendirin.
import io
from contextlib import redirect_stdout
buf = io.StringIO()
with redirect_stdout(buf):
print("captured")
print(buf.getvalue()) # capturedKısa Kontrol
Bir @contextmanager üretecinde, istisna oluştuğunda bile çalışmasını garanti etmek için temizleme kodu nereye yerleştirilmelidir?
Özet
@contextmanager, bir üreteci bağlam yöneticisine dönüştürür. Güvenli temizleme için yield ifadesinin çevresinde try/finally kullanın. contextlib modülü ayrıca suppress, nullcontext, ExitStack ve daha fazlasını sağlar.
Sıkça Sorulan Sorular
“contextlib: @contextmanager” dersi ücretsiz mi?
Evet — “contextlib: @contextmanager” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Python Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Python Academy kursu toplamda 4 dersten oluşur.
“contextlib: @contextmanager” dersinde ne öğreneceğim?
contextlib dekoratörüyle kısa ve öz bağlam yöneticileri oluşturun. Python Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Python Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Python Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“contextlib: @contextmanager” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Python Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Python Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- with Deyimini Ayrıntılı İnceleme
- __enter__ ve __exit__ Protokolü
- contextlib: @contextmanager
- Pratik Bağlam Yöneticisi Kalıpları