Cara menggunakan realpython decorator

Artikel ini akan membahas panduan menggunakan fungsi bersarang di Python. Fungsi bersarang atau fungsi dalam didefinisikan di dalam fungsi Python lainnya. Mereka berguna dalam pola pemrograman dan kasus useran tertentu. Beberapa di antaranya akan dijelaskan dalam artikel ini. Semua contoh kode dalam artikel ini diuji dengan Python 3.9.5 di Ubuntu 21.04.

Tentang Fungsi Bersarang / Dalam

Fungsi bersarang, seperti namanya, adalah fungsi Python yang dibuat di dalam fungsi Python lainnya. Selain ruang lingkupnya sendiri, fungsi dalam memiliki akses ke objek yang tersedia dalam ruang lingkup fungsi luar. Fungsi dalam dapat disebut sebagai objek Python tunggal dengan data dan variabelnya sendiri. Fungsi dalam ini dilindungi oleh fungsi luar dan tidak dapat dipanggil atau dirujuk dari lingkup global. Dengan cara ini fungsi dalam bertindak sebagai entitas tersembunyi yang bekerja dalam batas-batas fungsi luar saja dan lingkup global tetap tidak menyadarinya. Proses ini juga dikenal sebagai “enkapsulasi” dalam pemrograman. Berikut adalah contoh fungsi bersarang di Python.

def visibile_outer_function(name):
    def  hidden_inner_function():
        print (name)
    hidden_inner_function()

visibile_outer_function("John")
hidden_inner_function()

Fungsi luar mengambil satu argumen wajib yang disebut “nama”. Fungsi dalam memiliki akses ke ruang lingkup fungsi luar sehingga dapat menggunakan variabel nama. Panggilan ke fungsi dalam kemudian dilakukan di fungsi luar. Selanjutnya, panggilan ke fungsi dalam dan luar dilakukan dalam lingkup global. Setelah menjalankan contoh kode di atas, Anda akan mendapatkan output berikut:

John
Traceback (most recent call last):
  File "main.py", line 9, in
    hidden_inner_function()
NameError: name 'hidden_inner_function' is not defined

Seperti yang Anda lihat di output, fungsi luar berfungsi dengan baik saat Anda memanggilnya dari lingkup global. Error muncul ketika Anda mencoba memanggil fungsi dalam karena tidak ada hal seperti itu yang tersedia dalam lingkup global.

Kasus Penggunaan Fungsi Dalam

Sekarang setelah Anda memiliki pemahaman tentang fungsi bersarang, Anda mungkin bertanya-tanya tentang kegunaannya dan kapan menggunakannya. Salah satu useran paling umum dari fungsi dalam adalah untuk membuat fungsi pembantu di dalam fungsi utama. Fungsi dalam juga dapat digunakan sebagai dekorator dan dapat digunakan untuk menerapkan penutupan dalam program Anda. Kasus useran ini dijelaskan di bawah ini dengan contoh.

Membuat Fungsi Pembantu

Fungsi pembantu sama seperti fungsi Python lainnya, tetapi disebut fungsi “pembantu” karena dapat membantu mengatur kode kompleks dengan lebih baik dan dapat digunakan kembali beberapa kali untuk menghindari pengulangan kode. Di bawah ini adalah contoh kode yang menggambarkan fungsi pembantu dalam.

def get_ticket_price(name):
    members = ["Tony", "Peter", "Mark"]
    price = 10

    def get_discounted_price(discount=1.0):
        return (price * discount)

    if name in members:
        ticket_price = get_discounted_price(discount=0.50)
    else:
        ticket_price = get_discounted_price()
    print ("Ticket price for " + name + " is: $" + str(ticket_price))

get_ticket_price("Tony")
get_ticket_price("John")

Fungsi luar utama yang dapat dipanggil adalah “get_ticket_price”. Dibutuhkan nama seseorang sebagai argumen wajib. Fungsi “get_discounted_price” adalah fungsi pembantu dalam yang menggunakan “diskon” sebagai argumen opsional. Daftar “anggota” berisi nama semua anggota terdaftar yang memenuhi syarat untuk mendapatkan diskon. Harga diskon untuk anggota dihitung dengan memanggil fungsi dalam dan memberikan nilai diskon sebagai argumen. Fungsi pembantu ini dapat dipanggil beberapa kali berdasarkan persyaratan dan Anda juga dapat mengubah logika di dalam fungsi dalam. Dengan demikian, fungsi pembantu dalam memungkinkan Anda menyederhanakan kode dan menghindari pengulangan yang tidak perlu. Setelah menjalankan contoh kode di atas, Anda akan mendapatkan output berikut:

Ticket price for Tony is: $5.0
Ticket price for John is: $10.0

Seperti yang Anda lihat pada output di atas, Tony mendapat diskon harga tiket karena dia ada di daftar anggota.

Menerapkan Penutupan

Penutupan adalah contoh dari fungsi dalam yang dikembalikan oleh fungsi luar. Fungsi dalam ini memiliki akses ke ruang lingkup fungsi luar dan mereka terus memiliki akses ke ruang lingkup fungsi luar bahkan setelah fungsi luar berhenti dijalankan. Lihat contoh kode di bawah ini:

def get_discounted_price(price):
    def discounted_price(discount):
        return price * discount
    return discounted_price

first_discount = get_discounted_price(10)
second_discount = get_discounted_price(10)
print (first_discount(0.50))
print (second_discount(0.60))

Fungsi luar “ge
t_discounted_price” mengembalikan referensi ke fungsi dalam yang disebut “discounted_price”. Perhatikan bahwa dalam pernyataan return, fungsi dipanggil tanpa kurung kurawal. Selanjutnya, dua instance baru yang disebut “first_discount” dan “second_dicount” dibuat dengan memanggil fungsi luar dan nilai untuk argumen “price” diberikan ke panggilan ini. Pada titik waktu ini, fungsi luar telah selesai dijalankan tetapi statusnya telah disimpan di objek first_discount dan second_discount. Sekarang ketika Anda memanggil instance first_discount dan second_discount dengan kurung kurawal dan argumen, mereka sudah memiliki akses ke variabel yang disebut harga beserta nilainya. Argumen yang diberikan ke instance ini sekarang menuju ke fungsi dalam yang kemudian mengembalikan hasil.

Setelah menjalankan contoh kode di atas, Anda akan mendapatkan output berikut:

5.0
6.0

Penutupan umumnya digunakan dalam situasi di mana program Anda memerlukan pelestarian status fungsi.

Membuat Fungsi Dekorasi

Fungsi dekorator di Python mengubah perilaku fungsi Python yang ada tanpa mengubahnya. Jadi saat Anda melampirkan dekorator ke suatu fungsi, Anda dapat menambahkan fungsionalitas tambahan ke fungsi tersebut atau memodifikasi perilakunya sambil menjaga perilaku aslinya tetap utuh. Dekorator Python khas terlihat seperti ini:

@decorator
def decorated():
    pass

Di sini “@decorator” akan mengubah perilaku fungsi “dihiasi”. Anda dapat membuat fungsi dekorator menggunakan fungsi bersarang. Untuk membuat dekorator, tentukan fungsi dan berikan ke fungsi luar sebagai argumen. Fungsi yang diteruskan ini kemudian dipanggil di dalam fungsi dalam lain di mana Anda dapat menggunakannya dan mengimplementasikan logika. Akhirnya fungsi luar mengembalikan fungsi dalam yang berisi perilaku yang dimodifikasi. Perhatikan contoh kode di bawah ini.

def get_discounted_price(amount):
    def discounted_price():
        price = amount()
        new_price = price * 0.50
        return new_price
    return discounted_price

Fungsi luar “get_discounted_price” dilewatkan fungsi lain yang disebut “jumlah” sebagai argumen. Fungsi dalam memanfaatkan fungsi yang diteruskan dan menambahkan perilaku tertentu ke dalamnya. Fungsi luar kemudian mengembalikan referensi ke fungsi dalam yang berisi perilaku yang dimodifikasi. Setelah menentukan dekorator, Anda dapat memanggilnya dengan cara berikut:

@get_discounted_price
def get_price():
    return 10

print (get_price())

Dekorator dilampirkan ke fungsi yang perilakunya Anda coba ubah. Mereka selalu memulai dengan simbol “@”. Dengan menggunakan dekorator di sini, Anda meneruskan fungsi “get_price” ke fungsi “get_discounted_price” sebagai argumen. Sekarang ketika Anda memanggil fungsi get_price, Anda tidak akan mendapatkan 10 sebagai output tetapi angka yang dimodifikasi oleh dekorator get_discounted_price. Setelah menjalankan contoh kode di atas, Anda akan mendapatkan output berikut:

5.0

Penggunaan dekorator yang ditunjukkan di atas setara dengan kode berikut:

John
Traceback (most recent call last):
  File "main.py", line 9, in
    hidden_inner_function()
NameError: name 'hidden_inner_function' is not defined
0

Alih-alih menggunakan sintaks “@decorator” sebagai singkatan, Anda cukup membuat instance baru dari fungsi luar dan menyediakannya fungsi lain sebagai argumen. Hasil akhir dari kedua pola pengkodean adalah sama. Karena dekorator menjaga perilaku fungsi asli tetap utuh, mereka sangat berguna jika Anda ingin memanggilnya berdasarkan kasus per kasus dan pada saat yang sama mempertahankan implementasi vanilla dari fungsi yang didekorasi.

Kesimpulan

Anda dapat menggunakan fungsi bersarang dalam berbagai cara untuk membuat fungsi dalam yang menambahkan fungsionalitas dan logika tambahan ke fungsi luar. Beberapa kasus useran paling umum untuk fungsi bersarang telah dijelaskan dalam artikel. Anda juga dapat membuat implementasi sendiri dari fungsi dalam, karena semua fungsi diperlakukan sebagai objek kelas satu dalam Python dan dapat dikembalikan atau diteruskan sebagai argumen.

Apa itu Decorator di Python?

Decorator merupakan komponen penting dalam Python yang mendukung fleksibilitas dalam manipulasi fungsi. Per definisi, decorator adalah fungsi yang melakukan operasi terhadap fungsi lain dan memodifikasi perilakunya tanpa harus mengubah secara eksplisit.

Apa yang dimaksud dengan decorator?

Arti kata "decorator" Bahasa Inggris dalam Bahasa Indonesia. kb. penghias. interior d. penghias rumah.