Context manager nedir? with ifadesi nasıl çalışır ve kendi context manager'ınızı nasıl yazarsınız?
Cevap
Context manager, bir kaynağın edinilmesini ve garanti şekilde serbest bırakılmasını sağlayan nesnedir. with bloğu hata ile çıksa bile temizlik kodu çalışır. Dosya, veritabanı bağlantısı, kilit (lock) ve transaction yönetiminde kullanılır.
Protokol
__enter__: blok başında çağrılır, dönüşüasdeğişkenine atanır.__exit__(exc_type, exc, tb): blok bitince çağrılır.Truedönerse istisna yutulur.
import time
class Zamanlayici:
def __enter__(self):
self.bas = time.perf_counter()
return self
def __exit__(self, exc_type, exc, tb):
self.sure = time.perf_counter() - self.bas
print(f"{self.sure:.3f} sn")
return False # istisnayı yukarı ilet
with Zamanlayici():
sum(range(10_000_000))contextlib ile daha kısa
from contextlib import contextmanager
@contextmanager
def transaction(conn):
try:
yield conn
conn.commit()
except Exception:
conn.rollback()
raiseyield öncesi __enter__, sonrası __exit__ gibi davranır. try/finally kullanmazsanız hata durumunda temizlik çalışmaz.
Faydalı araçlar
contextlib.suppress(FileNotFoundError): belirli istisnaları yok sayar.contextlib.ExitStack: dinamik sayıda context manager'ı yönetir.- Async kod için
async withve__aenter__/__aexit__(veya@asynccontextmanager).
İlgili Python soruları
- list ve tuple arasındaki fark nedir?
- Varsayılan argüman olarak liste vermek neden tehlikelidir?
- Decorator nedir? Basit bir zamanlama decorator'ı yazın.
- Generator nedir, yield ne yapar?
- GIL nedir ve çoklu iş parçacığını nasıl etkiler?
- async/await ve asyncio nasıl çalışır? Ne zaman thread veya process yerine tercih edilir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.