__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 FalseTimer 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) # TrueLock 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
passKı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
- with Deyimini Ayrıntılı İnceleme
- __enter__ ve __exit__ Protokolü
- contextlib: @contextmanager
- Pratik Bağlam Yöneticisi Kalıpları