A.24. Python Args & Kwargs
Pada chapter ini kita akan belajar tentang penerapan args dan kwargs pada fungsi di Python.
A.24.1. Pengenalan Args
Args (atau yang umumnya ditulis sebagai *args) merupakan notasi penulisan parameter spesial dengan kapabilitas bisa menampung banyak positional argument untuk ditampung dalam 1 parameter saja.
Agar lebih jelas tentang kegunaan args, mari pelajari terlebih dahulu kode berikut:
def sum_then_print(n1, n2, n3, n4, n5):
total = n1 + n2 + n3 + n4 + n5
print(total)
sum_then_print(2, 3, 4, 5, 4)
# output ➜ 18
Fungsi sum_then_print()
menerima 5 buah argument numerik yang dari nilai tersebut kemudian dihitung totalnya lalu ditampilkan.
Fungsi tersebut memiliki limitasi yaitu hanya bisa menerima 5 buah data numerik. Untuk membuatnya bisa menampung sejumlah data, solusinya bisa dengan cukup menggunakan 1 parameter saja dengan data argument yang disisipkan harus dalam tipe data sequence seperti list, atau solusi alternatif lainnya bisa dengan menggunakan *args yang di bawah ini dibahas.
Implementasi args cukup mudah, pada deklarasi fungsi tulis saja parameter dengan nama apapun bebas, tetapi pada penulisannya diawali karakter asterisk atau *, contohnya seperti parameter numbers
berikut:
def sum_then_print(*numbers):
total = 0
for n in numbers:
total = total + n
print(total)
sum_then_print(2, 3, 4, 5, 4)
# output ➜ 18
Fungsi di atas parameter numbers
-nya ditulis menggunakan notasi *args, maka parameter tersebut akan menampung semua argument yang disisipkan saat pemanggilan fungsi. Nilai argument disimpan oleh parameter numbers
dalam bentuk tuple. Variabel numbers
di-iterasi nilainya lalu dihitung totalnya.
◉ Args untuk argument dengan tipe data bervariasi
Metode *args ini mampu menampung segala jenis argument tanpa meghiraukan tipe datanya. Contohnya bisa dilihat pada program berikut ini:
def print_data(*params):
print(f"type: {type(params)}, data: {params}")
for i in range(len(params)):
print(f"param {i}: {params[i]}")
print_data("hello python", 123, [5, True, ("yesn't")], {"iwak", "peyek"})
# output ↓
#
# type: <class 'tuple'>, data: ('hello python', 123, [5, True, "yesn't"], {'iwak', 'peyek'})
# param 0: hello python
# param 1: 123
# param 2: [5, True, "yesn't"]
# param 3: {'iwak', 'peyek'}
◉ Kombinasi positional argument dan args
Args sebenarnya tidak benar-benar menangkap semua argument pemanggilan fungsi, melainkan hanya argument yang ditulis sesuai posisi parameter hingga posisi setelahnya. Misalnya, sebuah fungsi memiliki 2 parameter dimana parameter pertama menampung string dan parameter kedua adalah *args, maka pada contoh ini parameter *args hanya menampung argument ke-2 dan setelahnya. Contoh:
def sum_then_print(message, *numbers):
total = 0
for n in numbers:
total = total + n
print(f"{message} {total}")
sum_then_print("total nilai:", 2, 3, 4, 5, 4)
# output ➜ total nilai: 18
Bisa dilihat, pada kode di atas parameter message
menampung argument ke-1 yaitu string total nilai:
, dan parameter numbers
menampung argument ke-2 hingga seterusnya (yaitu data 2
, 3
, 4
, 5
, 4
).
Perlu diketahui dalam penerapan kombinasi positional argument dan args, positional argument harus selalu ditulis sebelum parameter *args.
◉ Kombinasi positional argument, args, dan keyword argument
Keyword argument bisa digunakan bebarengan dengan positional argument dan *args, dengan syarat harus dituliskan di akhir setelah *args.
def sum_then_print(message, *numbers, suffix_message):
total = 0
for n in numbers:
total = total + n
print(f"{message} {total} {suffix_message}")
sum_then_print("total nilai:", 2, 3, 4, 5, 4, suffix_message="selesai!")
# output ➜ total nilai: 18 selesai!
A.24.2. Pengenalan Kwargs
Kwargs (atau yang umumnya ditulis sebagai **kwargs atau keyword arguments) merupakan notasi penulisan parameter spesial dengan kapabilitas bisa menampung banyak keyword argument pemanggilan fungsi dalam 1 parameter saja.
def print_data(**data):
print(f"type: {type(data)}")
print(f"data: {data}")
for key in data:
print(f"param: {key}, value: {data[key]}")
print_data(phone="nokia 3310", discontinue=False, year=2000, networks=["GSM", "TDMA"])
# output ↓
#
# type: <class 'dict'>
# data: {'phone': 'nokia 3310', 'discontinue': False, 'year': 2000, 'networks': ['GSM', 'TDMA']}
#
# param: phone, value: nokia 3310
# param: discontinue, value: False
# param: year, value: 2000
# param: networks, value: ['GSM', 'TDMA']
Argument yang ditampung oleh parameter **kwargs datanya tersimpan dalam bentuk dictionary dengan key adalah nama parameter dan value adalah nilai argument.
◉ Kombinasi positional argument dan kwargs
Kwargs sebenarnya hanya menampung semua argument mulai dari argument ke-n
hingga seterusnya dimana n
adalah nomor/posisi **kwargs ditulis.
Contohnya pada kode berikut, parameter data
hanya akan menampung argument nomor ke-3 hingga seterusnya. Argument pertama ditampung oleh parameter message
sedangkan argument ke-2 oleh parameter number
.
def print_data(message, number, **data):
print(f"message: {message}")
print(f"number: {number}")
print()
for key in data:
print(f"param: {key}, value: {data[key]}")
print_data("sesuk prei", 2023, phone="nokia 3315", networks=["GSM", "TDMA"])
# output ↓
#
# message: sesuk prei
# number: 2023
#
# param: phone, value: nokia 3310
# param: networks, value: ['GSM', 'TDMA']
Dalam penerapannya, positional argument harus selalu ditulis sebelum parameter **kwargs.
◉ Kombinasi positional argument, args dan kwargs
Kombinasi antara positional argument, *args, dan **kwargs juga bisa dilakukan dengan ketentuan semua positional argument ditulis terlebih dahulu, kemudian diikuti *args, lalu **kwargs.
Contoh penerapannya:
def print_all(message, *params, **others):
print(f"message: {message}")
print(f"params: {params}")
print(f"others: {others}")
print_all("hello world", 1, True, ("yesn't", "nope"), name="nokia 3310", discontinued=True, year_released=2000)
# output ↓
#
# message: hello world
# params: (1, True, ("yesn't", 'nope'))
# others: {'name': 'nokia 3310', 'discontinued': True, 'year_released': 2000}
Python secara cerdas mengidentifikasi argument mana yang akan disimpan pada positional parameter, *args, dan **kwargs. Pada kode di atas, mapping antara arguments dengan parameter adalah seperti ini:
- Argument
hello world
ditampung parametermessage
. - Argument
1
,True
,dan("yesn't", "nope")
ditampung parameterparams
. - Keyword argument
name="nokia 3310"
,discontinued=True
, danyear_released=2000
ditampung parameterothers
.
◉ Kombinasi positional argument, args, keyword argument, dan kwargs
Keyword argument bisa dituliskan diantara *args, dan **kwargs, diluar itu menghasilkan error.
def print_all(message, *params, say_something, **others):
print(f"message: {message}")
print(f"params: {params}")
print(f"say_something: {say_something}")
print(f"others: {others}")
print_all("hello world", 1, True, ("yesn't", "nope"), say_something="how are you", name="nokia 3310", discontinued=True, year_released=2000)
# output ↓
#
# message: hello world
# params: (1, True, ("yesn't", 'nope'))
# say_something: how are you
# others: {'name': 'nokia 3310', 'discontinued': True, 'year_released': 2000}
Catatan chapter 📑
◉ Source code praktik
github.com/novalagung/dasarpemrogramanpython-example/../args-kwargs