Cara Menggunakan Manajer Konteks dengan Python (dengan pernyataan)

Pelajari cara kerja pengelola konteks dengan Python. Kuasai pernyataan with, kelola sumber daya sistem, dan tulis pengelola konteks khusus.

Coba Solusi ini di Editor

Ikhtisar

Mengelola sumber daya eksternal dengan benar—seperti menutup pegangan file, memutus koneksi database, dan melepaskan kunci thread—sangat penting untuk membangun perangkat lunak yang andal dan siap produksi. Gagal melepaskan sumber daya dapat mengakibatkan kebocoran memori, kesalahan kunci file, dan aplikasi hang.

Pernyataan `with` Python menyederhanakan pembersihan sumber daya dengan membuat manajer konteks. Manajer konteks menjamin bahwa tindakan pembersihan secara otomatis dijalankan ketika kontrol meninggalkan blok, bahkan jika kode memunculkan pengecualian atau keluar lebih awal. Hal ini menghilangkan kebutuhan akan blok `coba-akhirnya` yang berulang-ulang dan bertele-tele.

Meskipun pengelola konteks paling sering dikaitkan dengan operasi bawaan seperti `open()`, Anda dapat dengan mudah merancang pengelola konteks khusus Anda sendiri. Anda dapat membangunnya dengan membuat kelas yang mengimplementasikan metode ajaib `__enter__` dan `__exit__`, atau dengan menulis fungsi generator yang dihiasi dengan dekorator `contextlib.contextmanager`.

Kode & Output Eksekusi

Skrip ini mendemonstrasikan penulisan pengelola konteks khusus dengan Python menggunakan implementasi kelas dan dekorator kontekslib.

context_managers.py
Coba di Editor
from contextlib import contextmanager

# Method 1: Class-based context manager
class CustomResource:
    def __enter__(self):
        print("[Resource] Opening connection...")
        return self

    def do_work(self):
        print("[Resource] Performing action...")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("[Resource] Closing connection safely.")
        return False

print("--- Class Context Manager ---")
with CustomResource() as resource:
    resource.do_work()

# Method 2: Generator-based context manager (contextlib)
@contextmanager
def simple_timer():
    print("\n[Timer] Started...")
    try:
        yield
    finally:
        print("[Timer] Finished!")

print("\n--- Decorator Context Manager ---")
with simple_timer():
    print("Performing tasks inside context...")
Keluaran Terminal
--- Class Context Manager ---
[Resource] Opening connection...
[Resource] Performing action...
[Resource] Closing connection safely.

--- Decorator Context Manager ---

[Timer] Started...
Performing tasks inside context...
[Timer] Finished!

Implementasi Langkah demi Langkah

  • Gunakan pernyataan with saat membuka file, database, atau kunci untuk menjamin keamanan sumber daya.
  • Tentukan pengelola konteks khusus menggunakan kelas dengan metode ajaib __enter__ dan __exit__.
  • Gunakan dekorator @contextlib.contextmanager pada fungsi generator sebagai alternatif berbasis fungsi yang lebih sederhana.
  • Tempatkan tindakan penutupan sumber daya di dalam blok pembersihan untuk memastikan tindakan tersebut berjalan meskipun terjadi kesalahan.

Pertanyaan yang Sering Diajukan

Parameter apa yang diterima metode __exit__?

Metode __exit__ menerima tiga argumen yang mewakili detail pengecualian jika ada yang dimunculkan: exc_type (tipe pengecualian), exc_val (nilai pengecualian), dan exc_tb (traceback). Jika tidak ada kesalahan yang terjadi, ketiganya dilewatkan sebagai Tidak Ada.

Bisakah manajer konteks menyembunyikan pengecualian?

Ya. Jika metode __exit__ mengembalikan nilai kebenaran (seperti True), Python menekan pengecualian dan eksekusi berlanjut setelah blok with. Jika mengembalikan False, pengecualian dimunculkan secara normal.

Topik Terkait

Sumber Daya Python yang Direkomendasikan

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