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üşü as değişkenine atanır.
  • __exit__(exc_type, exc, tb): blok bitince çağrılır. True dö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()
        raise

yield ö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 with ve __aenter__ / __aexit__ (veya @asynccontextmanager).
  1. list ve tuple arasındaki fark nedir?KolayPythonBackend
  2. Varsayılan argüman olarak liste vermek neden tehlikelidir?OrtaPythonBackend
  3. Decorator nedir? Basit bir zamanlama decorator'ı yazın.OrtaPythonBackend
  4. Generator nedir, yield ne yapar?OrtaPythonBackend
  5. GIL nedir ve çoklu iş parçacığını nasıl etkiler?ZorPythonBackend
  6. async/await ve asyncio nasıl çalışır? Ne zaman thread veya process yerine tercih edilir?ZorPythonBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle