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
- Mendefinisikan Fungsi Closure
- Kriteria Closure
- Kapan Closure Digunakan?
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.