Python Context Manager

Intro Context Manager

Adalah object yang didesain untuk digunakan dalam with statement. Bertugas untuk memastikan penanganan resource secara tepat dan otomatis.

Enter method memastikan object siap digunakan. Exit method memastikan object ditutup dengan benar dan dihapus.

Contoh sederhana, dengan with block untuk membuka file dan menulis kedalam file.

Saat masuk kedalam block, context manager memastikan resource untuk object file bisa diakses. Setelah keluar dari with block, context manager otomatis menutup object dan membersihkan resouce. Terbukti dengan mengecek status f.closed.

>>> with open("file01.txt", "w") as f:
...    f.write('lorem ipsum')
...
11
>>> f.closed
True
>>>

Keuntungan dari penggunaan with-statement ini adalah context manager memastikan object di tutup dan dibersihkan dengan tepat, bahkan jika ada exception didalam with block.

Context Manager Algoritma

Berikut demo context manager lifecycle

class ConMan:
    def __enter__(self):
        print("LoggingContextMananager.__enter()")
        return "Didalam with block..."

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('LoggingContextMananager.__exit__({}, {}, {})'.format(exc_type, exc_val, exc_tb))
        return

Jalankan dalam REPL.

>>> from conman import *
>>> with ConMan() as x:
...     print(x)
... 
LoggingContextMananager.__enter()
Didalam with block...
LoggingContextMananager.__exit__(None, None, None)

SIlakan bereksperimen dengan membuat error didalam with block.

>>> with ConMan() as x:
...     raise ValueError("Error...")
...
LoggingContextMananager.__enter()
LoggingContextMananager.__exit__(<class 'ValueError'>, Error..., <traceback object at 0x01CA9888>)
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError: Error...

Summary

__enter__()

  • Dipanggil sesaat sebelum masuk ke with block statement.
  • Return value terkait pada as-variable
  • Dapat melakukan return value apa saja, termasuk none.
  • Umumnya mengembalikan dirinya sendiri (self).

__exit__()

Dieksekusi setelah with block di terminate.
Menangani exception exit dari with-block.
Menerima exception type, value dan traceback.
Argumen none, menunjukan tidak ada exception.
Secara default akan melakukan propagasi exceptions dari with-block.

Sharing is caring:

Leave a Comment