CodeGym /Kurslar /Python SELF AZ /with operatoru

with operatoru

Python SELF AZ
Səviyyə , Dərs
Mövcuddur

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, exceptfinally 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__()__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__()__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__()__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_valexc_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ə")
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION