0Pricing
Python Academy · Ders

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():
    pass

asynccontextmanager

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())  # captured

Kı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

  1. with Deyimini Ayrıntılı İnceleme
  2. __enter__ ve __exit__ Protokolü
  3. contextlib: @contextmanager
  4. Pratik Bağlam Yöneticisi Kalıpları
← Python Academy Sayfasına Dön