Context managers, belirli kaynakların (dosya, ağ bağlantısı, kilitler vb.) güvenli ve doğru bir şekilde yönetilmesini sağlayan yapılardır. Python‘da context managers genellikle with
anahtar kelimesi ile kullanılır ve bu kaynakların kullanımını kolaylaştırır. with
bloğu sona erdiğinde, context manager tarafından yönetilen kaynak otomatik olarak temizlenir veya serbest bırakılır.
1. with
Anahtar Kelimesi ve Dosya İşlemleri
Python’da en yaygın context manager kullanımı dosya işlemlerindedir. with
anahtar kelimesi ile dosyalar açılır ve işlendikten sonra otomatik olarak kapatılır. Bu, dosyanın manuel olarak kapatılmasını gerektirmez ve dosyanın kapatılmasının unutulması gibi olası hataları önler.
Örnek:
with open("example.txt", "w") as file:
file.write("Merhaba, dünya!")
Bu örnekte:
open
fonksiyonu ile açılan dosya,with
bloğu sona erdiğinde otomatik olarak kapatılır. Bu sayede,file.close()
çağrısına gerek kalmaz.
2. __enter__
ve __exit__
Metodları
Context managers, sınıflar kullanılarak tanımlanabilir. Bunun için __enter__
ve __exit__
metodları kullanılır:
__enter__
Metodu:with
bloğuna girerken çalıştırılır ve genellikle kaynakları hazırlar. Bu metot, context manager’ın döndüreceği değeri belirler.__exit__
Metodu:with
bloğu sona erdiğinde veya bir istisna meydana geldiğinde çalıştırılır ve genellikle kaynakları temizler.
a. Basit Bir Context Manager Örneği
Örnek:
class DosyaYoneticisi:
def __init__(self, dosya_adi, mod):
self.dosya_adi = dosya_adi
self.mod = mod
def __enter__(self):
self.dosya = open(self.dosya_adi, self.mod)
return self.dosya
def __exit__(self, exc_type, exc_val, exc_tb):
self.dosya.close()
with DosyaYoneticisi("deneme.txt", "w") as file:
file.write("Merhaba, dünya!")
Bu örnekte:
DosyaYoneticisi
sınıfı bir context manager olarak tanımlanmıştır.__enter__
metodu, dosyayı açar vewith
bloğuna dosya nesnesini döndürür.__exit__
metodu, dosyayı kapatır ve olası bir istisna (hata) durumunda temizleme işlemlerini gerçekleştirir.
b. İstisna Yönetimi ile Context Manager
__exit__
metodu, üç parametre alır: exc_type
, exc_val
, exc_tb
. Bu parametreler, bir istisna meydana geldiğinde ilgili hata türü ve değeri hakkında bilgi sağlar.
Örnek:
class DosyaYoneticisi:
def __init__(self, dosya_adi, mod):
self.dosya_adi = dosya_adi
self.mod = mod
def __enter__(self):
self.dosya = open(self.dosya_adi, self.mod)
return self.dosya
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type is not None:
print(f"Bir hata oluştu: {exc_val}")
self.dosya.close()
return True # Hata durumu bu satırla bastırılır (optional)
with DosyaYoneticisi("deneme.txt", "w") as file:
file.write("Merhaba, dünya!")
raise ValueError("Örnek bir hata!")
Bu örnekte:
with
bloğunda birValueError
hatası meydana gelir.__exit__
metodu bu hatayı yakalar ve kullanıcıya bildirir.return True
ifadesi ile hatanın bastırılması sağlanır, yaniwith
bloğundaraise
edilen hata,with
bloğu dışına taşınmaz.
3. contextlib
Modülü ile Context Manager
Python’da context manager’lar oluşturmanın bir başka yolu da contextlib
modülünü kullanmaktır. Bu modül, daha kısa ve basit context manager’lar oluşturmayı sağlar.
a. contextlib.contextmanager
Dekoratörü
contextlib.contextmanager
dekoratörü, bir fonksiyonu context manager olarak tanımlamayı sağlar.
Örnek:
from contextlib import contextmanager
@contextmanager
def dosya_yonetimi(dosya_adi, mod):
dosya = open(dosya_adi, mod)
try:
yield dosya
finally:
dosya.close()
with dosya_yonetimi("deneme.txt", "w") as file:
file.write("Merhaba, dünya!")
Bu örnekte:
dosya_yonetimi
adlı bir context manager fonksiyonu tanımlanmıştır.yield
ifadesi,with
bloğuna dosya nesnesini döner vefinally
bloğu, dosyanın güvenli bir şekilde kapatılmasını sağlar.
b. contextlib.closing
Bazı nesnelerin bir close()
metodu vardır ancak context manager değillerdir. contextlib.closing
, bu nesneleri context manager olarak kullanmayı sağlar.
Örnek:
from contextlib import closing
from urllib.request import urlopen
with closing(urlopen("http://example.com")) as page:
for line in page:
print(line.decode('utf-8').strip())
Bu örnekte:
urlopen
ile açılan web sayfası,closing
kullanılarak context manager haline getirilir vewith
bloğu sonunda otomatik olarak kapatılır.
4. Context Managers Kullanım Alanları
Context managers, çeşitli alanlarda kaynak yönetimi için kullanılabilir:
- Dosya işlemleri: Dosyaları açma ve kapama.
- Veritabanı bağlantıları: Veritabanı bağlantısını açma ve kapama.
- Ağ bağlantıları: Ağ bağlantısını açma ve kapama.
- Kilitleme mekanizmaları: Çoklu iş parçacıkları veya işlemler arasında kilit mekanizmalarını yönetme.
- Zaman yönetimi: Zamanlama ölçümleri yapmak.
Context managers ve with
anahtar kelimesi, Python’da kaynakların güvenli ve doğru bir şekilde yönetilmesini sağlar. __enter__
ve __exit__
metodlarıyla kendi context manager’larınızı tanımlayabilir veya contextlib
modülünü kullanarak bu işlemi daha da kolaylaştırabilirsiniz. Context managers, özellikle dosya işlemleri, ağ bağlantıları ve kilit mekanizmaları gibi kaynakların doğru bir şekilde yönetilmesi gereken durumlarda yaygın olarak kullanılır ve yazılımda güvenliği artırır.
Bir yanıt yazın