Manajer Konteks Python: Membuat Kustom dengan Blok

Pelajari cara menulis pengelola konteks khusus dengan Python. Kuasai dekorator manajer konteks dan metode __enter__/__exit__ untuk keamanan sumber daya.

Coba di Editor

Ikhtisar

Manajer konteks adalah mekanisme elegan di Python yang dirancang untuk menangani penyiapan dan pembongkaran sumber daya eksternal. Dalam perangkat lunak, banyak operasi memerlukan tindakan berpasangan: membuka dan menutup file, menyambungkan dan memutuskan sambungan dari database, atau memperoleh dan melepaskan kunci. Jika suatu program crash setelah langkah setup tetapi sebelum langkah pembongkaran, sumber daya tersebut tetap terkunci di memori. Manajer konteks menjamin bahwa sumber daya dibersihkan dengan aman dalam segala keadaan.

Cara standar untuk memanggil pengelola konteks adalah menggunakan pernyataan `with`. Pada dasarnya, objek apa pun yang digunakan dalam pernyataan `with` harus mengimplementasikan Protokol Manajer Konteks. Protokol ini terdiri dari dua metode khusus: `__enter__()` dan `__exit__()`. Saat blok `with` dimulai, `__enter__()` dipanggil untuk menyiapkan sumber daya. Ketika blok `with` selesai atau memunculkan pengecualian, `__exit__()` secara otomatis terpicu, menerima informasi tentang pengecualian apa pun yang muncul sehingga dapat menangani pembersihan atau menekan kesalahan.

Untuk kasus penggunaan sederhana, menulis kelas dengan metode `__enter__` dan `__exit__` bisa terasa bertele-tele. Untuk menyederhanakannya, pustaka standar Python menyediakan modul `contextlib`, yang dilengkapi dekorator `@contextmanager`. Dekorator ini memungkinkan Anda menulis fungsi generator sederhana yang berisi satu pernyataan `hasil`. Kode sebelum `hasil` bertindak sebagai pengaturan, nilai yang dihasilkan bertindak sebagai sumber daya, dan kode setelah `hasil` mewakili pembersihan. Menguasai pengelola konteks memastikan aplikasi Anda tetap bebas kebocoran.

Kode & Output Eksekusi

Kelas khusus yang mengimplementasikan __enter__ dan __exit__ untuk mengelola batas pencatatan log eksekusi.

context_managers.py
Coba di Editor
class CustomManager:
    def __enter__(self):
        print("--> Resource Setup: Entering the block")
        return "RESOURCE_KEY"

    def __exit__(self, exc_type, exc_value, traceback):
        print("<-- Resource Teardown: Exiting the block")
        if exc_type:
            print(f"Exception Intercepted: {exc_value}")
        return True  # Suppress exceptions

with CustomManager() as res:
    print(f"Working inside block with resource: {res}")
    # Force an error to verify exception handling
    x = 1 / 0
print("Program continues running safely.")
Keluaran Terminal
--> Resource Setup: Entering the block
Working inside block with resource: RESOURCE_KEY
<-- Resource Teardown: Exiting the block
Exception Intercepted: division by zero
Program continues running safely.

Implementasi Langkah demi Langkah

  • Mengelola transaksi database (berkomitmen jika berhasil, kembalikan jika terjadi kesalahan)
  • Memperoleh dan melepaskan kunci utas dalam kode multi-utas
  • Mengarahkan keluaran standar (stdout) selama skrip pengujian unit

Pertanyaan yang Sering Diajukan

Bagaimana cara menyembunyikan pengecualian di pengelola konteks khusus?

Dengan mengembalikan True dari metode __exit__. Jika ia mengembalikan True, pengecualian apa pun yang muncul di dalam blok akan disembunyikan.

Bisakah Anda menggabungkan beberapa pengelola konteks dalam satu pernyataan?

Ya, Anda dapat memisahkannya dengan koma, misalnya dengan open('file1.txt') sebagai f1, open('file2.txt') sebagai f2:.

Topik Terkait

Sumber Daya Python yang Direkomendasikan

Perluas pengetahuan Anda dengan tutorial interaktif terkait, lembar contekan, dan perbandingan kode.