Python Closure

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



Tabel Konten









Variabel Non-lokal Dalam Fungsi Bersarang



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



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



Di Python, variabel non-lokal defaultnya adalah bersifat read only. Untuk mampu 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() mampu mengakses variabel non-lokal msg dari fungsi pembungkusnya.







Mendefinisikan Fungsi Closure



Pada contoh di atas, apa yang terjadi jikalau 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 hukuman 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 menyerupai 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, saat 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 Membuat 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.



 



 



Popular posts from this blog

Subitems Listview Berwarna Selang Seling

Source Code Aplikasi Tagihan Internet Memakai Php