4.1 Faylın bağlanması və səhvlərin işlənməsi
Bəzən fayl oxuyarkən səhvlər və ya istisnalar yaranır və fayl bağlanmamış qalır. Bu potensial olaraq yaddaş sızmasına və ya file handler’lərin
sızmasına səbəb ola bilər. Buna görə də faylla işi try-except
blokuna bükmək lazımdır.
Fərz edək ki, sizin bu cür kodunuz var idi:
file = open('example.txt', 'a') # Faylı açırıq
file.write("This is a new line added to the file.")
file.close() # Faylı bağlayırıq
Bunu try-except
blokuna salmaq lazımdır:
try:
file = open('example.txt', 'a') # Faylı açırıq
file.write("This is a new line added to the file.")
file.close() # Faylı bağlayırıq
except FileNotFoundError:
print("Fayl tapılmadı")
file.close() # Faylı bağlayırıq
close()
metodunu iki dəfə yazmamaq üçün onu finally
blokuna çıxarmaq olar:
try:
file = open('example.txt', 'a') # Faylı açırıq
file.write("This is a new line added to the file.")
except FileNotFoundError:
print("Fayl tapılmadı")
finally:
file.close() # Faylı bağlayırıq
Bu kod gözəl görünür, amma… işləmir, çünki file
dəyişəni yalnız try
blokunda təyin edilib və o, except
və finally
bloklarında mövcud deyil.
Ona görə də dəyişəni bir səviyyə yuxarıda təyin etməliyik:
file = None
try:
file = open('example.txt', 'a') # Faylı açırıq
file.write("This is a new line added to the file.")
except FileNotFoundError:
print("Fayl tapılmadı")
finally:
file.close() # Faylı bağlayırıq
Bu həll daha yaxşıdır, amma bunda da problemlər var. Məsələn, fayl heç açılmasa, file
dəyişəni None
olaraq qalacaq. Beləliklə, faylı bağlamağa cəhd etmək səhvə səbəb olacaq — mövcud olmayan obyektin close()
metoduna müraciət etməyə çalışacağıq.
Ona görə də close()
metodunu çağırmadan əvvəl yoxlama əlavə etməliyik:
file = None
try:
file = open('example.txt', 'a') # Faylı açırıq
file.write("This is a new line added to the file.")
except FileNotFoundError:
print("Fayl tapılmadı")
finally:
if file:
file.close() # Faylı bağlayırıq
Əgər təəccübləndinizsə ki, 3 sətirlik kod 9 sətrə çevrildi, siz tək deyilsiniz. Şükürlər olsun ki, bu problem üçün artıq hazır həll var və bunu müzakirə edəcəyik.
4.2 with
operatoru
Python-da with
operatoru resurslarla (məsələn, fayllarla) işləməyi asanlaşdırır, with
bloku bitdikdən sonra onların avtomatik bağlanmasını təmin edir. Bu, kodu sadələşdirir və bağlanmamış fayllar kimi resurs sızıntılarının qarşısını alır.
Ümumi with
operatorunun sintaksisi:
with ifadə as dəyişən:
dəyişən ilə işləmə
with
operatoru, kod blokunu context manager ilə əhatə etmək üçün istifadə olunur. with
operatorundan istifadə edərkən Python, context manager obyektinin __enter__()
və __exit__()
metodlarını avtomatik çağırır, bu da resursların idarə olunmasını sadələşdirir.
Fayllarla işləmək üçün with
istifadəsinə nümunə:
with open('example.txt', 'w') as file:
file.write("Salam, Dünya!\n")
file.write("Bu test faylıdır.\n")
Bu nümunədə example.txt
faylı yazma rejimində açılır və faylın adı file
dəyişəni ilə əlaqələndirilir. with
blokundakı kod yazma əməliyyatlarının hamısını yerinə yetirdikdən sonra faylı avtomatik bağlayır.
4.3 Faylın avtomatik bağlanması
with
operatorundan istifadə etməyin ən böyük üstünlüklərindən biri, kod blokunun bitməsindən sonra faylın avtomatik bağlanmasıdır. Bu, hətta istisna baş verdikdə belə baş verir və nəticədə kod daha təhlükəsiz və etibarlı olur.
Faylın avtomatik bağlanmasına nümunə:
try:
with open('example.txt', 'w') as file:
file.write("Salam, Dünya!\n")
file.write("Bu test faylıdır.\n")
# Faylın yenə də bağlanacağını yoxlamaq üçün istisna
raise Exception("Nəsə səhv baş verdi")
except Exception as e:
print(f"Istisna tutuldu: {e}")
# Bu nöqtədə fayl artıq bağlanmışdır
Həmişə fayllarla işləyərkən with
operatorundan istifadə edin. Bu, həm sadədir, həm də bir çox səhvləri qarşısını alır.
4.4 with
operatorunun arxasında nə var
with
operatorunun iş prinsipi __enter__()
və __exit__()
metodlarına əsaslanır. Bu metodlar kontekst meneceri kimi istifadə olunan class-da implementasiya edilməlidir.
Bir obyektin with
operatoru ilə istifadə edilməsi üçün onun __enter__()
və __exit__()
metodlarını implementasiya etməsi lazımdır. Bu metodlar kontekstdən giriş və çıxış zamanı obyektin necə davranacağını təyin edir.
__enter__()
metodu
__enter__()
metodu with
bloku-na giriş zamanı çağırılır. Bu metod resursu inizializasiya edir və as
sözündən sonra göstərilən dəyişənə bağlanacaq obyekti qaytarır.
__exit__()
metodu
__exit__()
metodu with
blokundan çıxış zamanı çağırılır. O, resursların azad edilməsi və ya faylların bağlanması kimi sonlandırma əməliyyatlarını yerinə yetirir. Metod üç arqument qəbul edir: exc_type
, exc_val
və exc_tb
, bunlar baş vermiş istisna vəziyyət haqqında məlumat saxlayır.
-
exc_type
: istisna növü (məsələn,ZeroDivisionError
). -
exc_val
: istisnanın dəyəri (məsələn, xəta mesajı). exc_tb
: istisna vəziyyətinin stack izləri.
Əgər __exit__()
metodu True
qaytarırsa, istisna vəziyyəti yatırılır. Əgər False
qaytarırsa, istisna vəziyyəti yenidən qaldırılır.
Nümunə:
class MyContextManager:
def __enter__(self):
print("Kontekstə giriş")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type:
print(f"Istisna baş verdi: {exc_type}, {exc_val}")
return False # Istisna yatırılmır
with MyContextManager() as manager:
print("with bloku daxilində")
GO TO FULL VERSION