Python Closure

Pada artikel ini, kita akan mempelajari tentang closure (pembungkus), cara mendefinisikan closure, dan alasan mengapa closure digunakan.

Tabel Konten


Variabel Non-lokal Dalam Fungsi Bersarang

Sebelum membahas tentang closure, pertama kali kita harus memahami tentang fungsi bersarang dan variabel non-lokal.

Fungsi bersarang adalah fungsi yang didefinisikan di dalam fungsi lain. Fungsi bersarang ini dapat mengakses variabel dari scope (lingkup) fungsi pembungkusnya.

Di Python, variabel non-lokal defaultnya adalah bersifat read only. Untuk dapat memodifikasinya, kita harus mendeklarasikannya sebagai variabel non-lokal (menggunakan keyword nonlocal).

Berikut ini adalah contoh fungsi bersarang dan variabel non-lokal.

def print_msg(msg): # Ini adalah fungsi pembungkus luar def printer(): # Ini adalah fungsi bersarang print(msg) printer() # Eksekusi fungsi # Output: Hello print_msg("Hello")

Bisa kita lihat pada contoh di atas, bahwa fungsi printer() dapat mengakses variabel non-lokal msg dari fungsi pembungkusnya.


Mendefinisikan Fungsi Closure

Pada contoh di atas, apa yang terjadi bila baris terakhir fungsi print_msg() mengembalikan fungsi printer() dan bukan memanggilnya? Perhatikan contoh berikut.

  def print_msg(msg): # Ini adalah fungsi pembungkus def printer(): # Ini adalah fungsi bersarang print(msg) return printer # baris ini diubah dari yang sebelumnya # Mari kita panggil fungsinya # Output: Hello another = print_msg("Hello") another()

Hasilnya tampak tidak biasa. Fungsi print_msg() dipanggil dengan argumen "Hello" dan fungsi kembaliannya dirujuk ke variabel another sehingga another menjadi fungsi. Pada saat pemanggilan another(), pesan yang ada masih tetap eksis meskipun kita sudah selesai mengeksekusi fungsi print_msg(). Padahal pada fungsi biasa, seharusnya variabel fungsi akan terhapus begitu eksekusi terhadap fungsi selesai.

Nilai yang ada pada scope fungsi pembungkus masih diingat meskipun variabel sudah di luar scope fungsi, atau bahkan setelah fungsi tersebut dihapus seperti pada contoh berikut.

>>> del print_msg
>>> print_msg("Hello")
Traceback (most recent call last):
...
NameError: name 'print_msg' is not defined

>>> another()
Hello

Kriteria Closure

Seperti terlihat dari contoh di atas, kita memiliki closure di Python pada saat fungsi bersarang (fungsi yang di dalam) merujuk pada variabel yang ada pada fungsi pembungkusnya.

Kriteria yang harus ada untuk membuat closure di Python adalah sebagai berikut:

  • Kita harus memiliki fungsi bersarang (fungsi dalam fungsi)
  • Fungsi yang di dalam harus merujuk ke variabel fungsi pembungkusnya
  • Fungsi pembungkus harus mengembalikan (me-return) fungsi yang di dalamnya.

Kapan Closure Digunakan?

Closure digunakan untuk menghindari penggunaan variabel global dan menyediakan fungsi penyembunyian data (data hiding) sebagai solusi berorientasi objek terhadap permasalahan.

Jika hanya sedikit (umumnya satu buah) metode yang hendak diimplementasikan pada sebuah kelas, kita lebih baik menggunakan closure daripada mendefinisikan kelas. Tapi, ketika banyak atribut dan metode yang akan dibuat, kita lebih baik menggunakan kelas.

Berikut ini adalah contoh di mana penggunaan closure lebih disarankan ketimbang menggunakan kelas untuk menciptakan objek. Tapi semua terserah pilihan Anda.

  def make_multiplier_of(n): def multiplier(x): return x * n return multiplier # Perkalian 3 times3 = make_multiplier_of(3) # Perkalian 5 times5 = make_multiplier_of(5) # Output: 27 print(times3(9)) # Output: 15 print(times5(3)) # Output: 30 print(times5(times3(2)))

Closure ini banyak dipergunakan dalam decorator di Python.

 

 

Bagikan:

Tinggalkan Balasan