contextlib.contextmanager decorator

Membuat class context manager cukup rumit, untuk mempermudah dapat digunakan library contextlib. contextlib adalah standard library Python yang menyediakan utility untuk fungsi umum yang berhubungan dengan with-statement.

Berikut garis besar penggunaan dari contextlib.contextmanager

@contextlib.contextmanager
def my_con_man():
    #enter
    try:
        yield [value]
        #normal exit
    except:
        #exception exit 
        raise

with my_con_man() as x:
    #code goes here

Mari kita ubah class context manager sebelumnya dengan menggunakan library contextlib.

import contextlib
import sys

@contextlib.contextmanager
def logging_con_man():
    print("Logging_Con_man: enter()")
    try:
        yield "In the block"
        print ("Logging_Con_man: normal exit")
    except Exception:
        print('Logging_con_man: exception exit', sys.exc_info())
>>> from conmanlib import *
>>> with logging_con_man() as x:
...     print(x)
...
Logging_Con_man: enter()
In the block
Logging_Con_man: normal exit
>>> with logging_con_man() as x:
...     raise ValueError()
...
Logging_Con_man: enter()
Logging_con_man: exception exit (<class 'ValueError'>, ValueError(), <traceback object at 0x01DD4048>)
>>>

Pada contoh diatas, saat terjadi exception, exception tidak di propagasi. Untuk melakukan propagasi, cukup tambahkan perintah raise.

import contextlib
import sys

@contextlib.contextmanager
def logging_con_man():
    print("Logging_Con_man: enter()")
    try:
        yield "In the block"
        print ("Logging_Con_man: normal exit")
    except Exception:
        print('Logging_con_man: exception exit', sys.exc_info())
        raise
>>> with logging_con_man() as x: .")
...     raise ValueError()
... 
Logging_Con_man: enter()
Logging_con_man: exception exit (<class 'ValueError'>, ValueError(), <traceback object at 0x01067128>)
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError

Exception dari context manager di propagasi, terlihat dengan adanya object Traceback pada log diatas.

Summary

  • contextlib mempermudah programmer untuk menggunakan context manager.
  • semua code sebelum perintah yield adalah bagian dari __enter__()
  • semua code setelah perintah yield adalah bagian dari __exit__()
  • exception ditangani dengan normal exception tool.

Dengan bearkhirnya modul ini, Course Pengenalan Python Error Handling sudah selesai. Semoga bermanfaat.

Sharing is caring:

Leave a Comment