0Pricing
Python Academy · Ders

__enter__ ve __exit__ Protokolü

Çift alt çizgili protokolü kullanarak bağlam yöneticileri oluşturun.

__enter__ ve __exit__ Protokolü, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 2. 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.

Bağlam Yöneticisi Protokolü

__enter__ ve __exit__ tanımlayan her nesne bir bağlam yöneticisidir ve with ile kullanılabilir.

class Managed:
    def __enter__(self):
        print("entering")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("exiting")
        return False

with Managed() as m:
    print("inside")

__enter__ Dönüş Değeri

__enter__, with bloğunun başlangıcında çağrılır. Dönüş değeri, as sonrasındaki değişkene bağlanır.

class Resource:
    def __enter__(self):
        self.value = 42
        return self  # bound to 'r'

    def __exit__(self, *args):
        self.value = None
        return False

with Resource() as r:
    print(r.value)  # 42

__exit__ Bağımsız Değişkenleri

__exit__(exc_type, exc_val, exc_tb), bir hata oluştuysa özel durum bilgilerini alır. Özel durum yoksa üçünün de değeri None olur.

class Safe:
    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type is ValueError:
            print(f"Suppressed ValueError: {exc_val}")
            return True   # suppress the exception
        return False      # re-raise anything else

with Safe():
    raise ValueError("oops")  # suppressed

Özel Durumları Bastırma

Özel durumu bastırmak için __exit__ içinden True döndürün. İletilmesine izin vermek için False (veya hiçbir şey) döndürün.

class Ignore:
    def __enter__(self): return self
    def __exit__(self, *args): return True  # swallow all exceptions

with Ignore():
    1 / 0

print("continues here")

Veritabanı Bağlantısı Örneği

Klasik bir kullanım: girişte bağlantı alınır, çıkışta commit/rollback yapılır ve bağlantı kapatılır.

class DBConn:
    def __enter__(self):
        self.conn = connect_db()
        return self.conn

    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type:
            self.conn.rollback()
        else:
            self.conn.commit()
        self.conn.close()
        return False

Timer Bağlam Yöneticisi

Başlangıcı __enter__ içinde kaydedip zaman farkını __exit__ içinde hesaplayarak geçen süreyi ölçün.

import time

class Timer:
    def __enter__(self):
        self.start = time.perf_counter()
        return self

    def __exit__(self, *args):
        self.elapsed = time.perf_counter() - self.start
        print(f"Elapsed: {self.elapsed:.3f}s")
        return False

with Timer():
    sum(range(1_000_000))

Bağlam Yöneticilerini İç İçe Kullanma

Birden çok bağlam yöneticisi tek bir with satırında birleştirilebilir.

with open("in.txt") as src, open("out.txt", "w") as dst:
    dst.write(src.read())

Yeniden Kullanılabilir ve Tek Kullanımlık Yöneticiler

Her __enter__ çağrısında yeni bir kaynak ayıran bağlam yöneticileri yeniden kullanılabilir. İç durumlarını tüketenler (yalnızca bir kez tutulan kilit gibi) yeniden kullanılamayabilir.

class Reusable:
    def __enter__(self):
        return []
    def __exit__(self, *a):
        return False

for _ in range(3):
    with Reusable() as lst:
        lst.append(1)
        print(lst)  # [1] each time

__aenter__ ve __aexit__ (Eş Zamanlı)

Eş zamanlı bağlam yöneticileri için __aenter__ ve __aexit__ ortak rutinlerini tanımlayın ve async with kullanın.

class AsyncDB:
    async def __aenter__(self):
        self.conn = await connect()
        return self.conn

    async def __aexit__(self, *args):
        await self.conn.close()

# async with AsyncDB() as conn:
#     ...

Dosya Nesnelerini Sarmalama

Python dosya nesneleri bağlam yöneticisi protokolünü zaten uygular; f.close() yöntemini hiçbir zaman kendiniz çağırmayın.

with open("data.txt", "r") as f:
    data = f.read()
# file is closed here automatically
print(f.closed)  # True

Lock Uygulama

İş parçacığı kilitleri bağlam yöneticisidir: __enter__ kilidi alır, __exit__ serbest bırakır.

import threading

lock = threading.Lock()

def update_shared():
    with lock:
        # critical section
        pass

Kısa Kontrol

Bir istisnayı bastırmak için __exit__ ne döndürmelidir?

Özet

Bağlam yöneticileri oluşturmak için __enter__ ve __exit__ uygulayın. Kaynağı __enter__ içinden döndürün; temizleme işlemini ve istisnaların bastırılmasını __exit__ içinde yönetin.

Sıkça Sorulan Sorular

“__enter__ ve __exit__ Protokolü” dersi ücretsiz mi?

Evet — “__enter__ ve __exit__ Protokolü” 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.

“__enter__ ve __exit__ Protokolü” dersinde ne öğreneceğim?

Çift alt çizgili protokolü kullanarak 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 2. dersidir.

“__enter__ ve __exit__ Protokolü” 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