Advanced Python: Membongkar Cara Kerja Decorator untuk Kode yang Lebih Fu[2D[K
Fungsional
Pendahuluan
Pernah lihat kode Python dengan simbol @ di atas definisi fungsi dan bert[4D[K
bertanya-tanya apa maksudnya? Itulah decorator — salah satu fitur Python ya[2D[K
yang paling powerful sekaligus paling sering disalahpahami.
Decorator bukan sekadar “sintaks manis” (syntactic sugar). Di balik simbol [K
@ tersebut tersembunyi konsep functional programming yang dalam: fungsi y[1D[K
yang membungkus fungsi lain untuk mengubah atau memperluas perilakunya tanp[4D[K
tanpa menyentuh kode aslinya.
Di artikel ini, kita akan membedah decorator dari akar: mulai dari konsep *[1D[K first-class function, membangun decorator dari nol, hingga pola-pola lanj[4D[K lanjutan yang dipakai di codebase produksi seperti logging otomatis, cachin[6D[K caching, dan validasi input.
Memahami Function sebagai First-Class Object
Sebelum masuk ke decorator, kita harus paham satu prinsip dasar Python: **f[3D[K fungsi adalah objek.
Artinya, fungsi bisa:
- Disimpan ke dalam variabel
- Dikirim sebagai argumen ke fungsi lain
- Dikembalikan sebagai nilai balik dari fungsi lain
# Fungsi bisa disimpan ke variabel
def sapa(nama):
return f"Halo, {nama}!"
ucapan = sapa # bukan sapa(), kita menyimpan fungsinya sendiri
print(ucapan("Budi")) # Output: Halo, Budi!
# Fungsi bisa dikirim sebagai argumen
def jalankan(func, nilai):
return func(nilai)
print(jalankan(sapa, "Sari")) # Output: Halo, Sari!
Konsep ini disebut first-class function. Tanpa memahami ini, decorator ak[2D[K akan terasa seperti sihir.
Selanjutnya, kita perlu mengenal closure — fungsi yang “mengingat” variab[6D[K variabel dari scope di mana ia dibuat:
def buat_pengali(faktor):
def kali(angka):
return angka * faktor # 'faktor' diingat dari scope luar
return kali
kali_tiga = buat_pengali(3)
kali_lima = buat_pengali(5)
print(kali_tiga(10)) # Output: 30
print(kali_lima(10)) # Output: 50
Fungsi kali adalah closure — ia mengingat nilai faktor meskipun