Args & Kwargs
*args dan **kwargs di Python
Ketika membuat function, terkadang kita tidak mengetahui berapa banyak argument yang akan diberikan oleh pengguna function tersebut.
Python menyediakan dua sintaks khusus untuk menangani kondisi tersebut:
*argsuntuk menerima banyak positional arguments.**kwargsuntuk menerima banyak keyword arguments.
Keduanya membuat function menjadi lebih fleksibel karena jumlah argument yang diterima tidak harus ditentukan satu per satu saat function dibuat.
*args
*args digunakan ketika sebuah function ingin menerima banyak positional arguments.
Contoh:
def super_func(*args):
print(args)
Function tersebut dapat dipanggil dengan jumlah argument yang berbeda:
super_func(1)
super_func(1, 2)
super_func(1, 2, 3, 4, 5)
Python akan mengumpulkan seluruh positional arguments tersebut ke dalam satu variabel bernama args.
args Berbentuk Tuple
Argument yang ditangkap oleh *args akan disimpan dalam bentuk tuple.
Contoh:
def super_func(*args):
print(args)
super_func(1, 2, 3, 4, 5)
Output:
(1, 2, 3, 4, 5)
Kita dapat memeriksa tipenya:
def super_func(*args):
print(type(args))
super_func(1, 2, 3)
Output:
<class 'tuple'>
Artinya, *args bukan membuat sebuah tipe data baru. Python mengumpulkan positional arguments ke dalam sebuah tuple.
Menggunakan args
Karena args berbentuk tuple, kita dapat menggunakan operasi yang sesuai dengan tuple atau iterable.
Contoh:
def super_func(*args):
return sum(args)
result = super_func(1, 2, 3, 4, 5)
print(result)
Output:
15
Function tersebut dapat menerima berapa pun jumlah angka yang diberikan.
Contoh:
print(super_func(10, 20))
print(super_func(1, 2, 3, 4, 5, 6))
print(super_func(100, 200, 300, 400))
Mengiterasi args
Karena args merupakan tuple, kita juga dapat melakukan looping.
def super_func(*args):
total = 0
for value in args:
total += value
return total
print(super_func(1, 2, 3, 4, 5))
Output:
15
Nama args Tidak Wajib
args sebenarnya bukan keyword khusus Python.
Tanda * yang memiliki makna khusus.
Kita dapat menggunakan nama lain:
def super_func(*numbers):
print(numbers)
super_func(1, 2, 3)
Output:
(1, 2, 3)
Namun, args merupakan konvensi yang sangat umum sehingga sebaiknya digunakan ketika tidak ada alasan khusus untuk menggunakan nama lain.
**kwargs
**kwargs digunakan untuk menerima banyak keyword arguments.
Contoh:
def super_func(**kwargs):
print(kwargs)
super_func(num1=5, num2=10)
Output:
{'num1': 5, 'num2': 10}
Berbeda dengan *args, data yang ditangkap oleh **kwargs disimpan dalam bentuk dictionary.
kwargs Berbentuk Dictionary
Kita dapat memeriksa tipe data kwargs.
def super_func(**kwargs):
print(type(kwargs))
super_func(num1=5, num2=10)
Output:
<class 'dict'>
Karena berbentuk dictionary, data dapat diakses menggunakan key.
def super_func(**kwargs):
print(kwargs['num1'])
print(kwargs['num2'])
super_func(num1=5, num2=10)
Output:
5
10
Mengiterasi kwargs
Karena kwargs merupakan dictionary, kita dapat menggunakan method dictionary seperti keys(), values(), dan items().
Contoh menggunakan values():
def super_func(**kwargs):
total = 0
for value in kwargs.values():
total += value
return total
print(super_func(num1=5, num2=10))
Output:
15
Menggunakan keys() dan values()
Contoh:
def show_data(**kwargs):
print('Keys:', kwargs.keys())
print('Values:', kwargs.values())
show_data(name='Budi', age=25)
Data yang diberikan akan disimpan sebagai pasangan key-value:
name → Budi
age → 25
Menggunakan items()
Kita juga dapat mengambil key dan value secara bersamaan.
def show_data(**kwargs):
for key, value in kwargs.items():
print(key, value)
show_data(
name='Budi',
age=25,
city='Palu'
)
Output:
name Budi
age 25
city Palu
Pola for key, value in kwargs.items() merupakan contoh tuple unpacking yang telah dipelajari sebelumnya.
Perbedaan *args dan **kwargs
Perhatikan perbedaan berikut:
| Sintaks | Jenis Argument | Bentuk Data di Dalam Function |
|---|---|---|
*args | Positional arguments | Tuple |
**kwargs | Keyword arguments | Dictionary |
Contoh:
def example(*args, **kwargs):
print(args)
print(kwargs)
example(1, 2, 3, name='Budi', age=25)
Output:
(1, 2, 3)
{'name': 'Budi', 'age': 25}
Menggabungkan Parameter Biasa dengan *args
*args dapat digunakan bersama parameter biasa.
Contoh:
def super_func(name, *args):
print(name)
print(args)
super_func('Budi', 1, 2, 3)
Output:
Budi
(1, 2, 3)
Pada contoh tersebut:
name → 'Budi'
args → (1, 2, 3)
Parameter name menerima positional argument pertama, sedangkan *args menangkap positional arguments berikutnya.
Menggabungkan Parameter Biasa dengan **kwargs
**kwargs juga dapat digunakan bersama parameter biasa.
def create_user(name, **kwargs):
print(name)
print(kwargs)
create_user(
'Budi',
age=25,
city='Palu'
)
Output:
Budi
{'age': 25, 'city': 'Palu'}
Urutan Parameter
Ketika beberapa jenis parameter digunakan dalam satu function, Python memiliki aturan mengenai urutannya.
Secara umum urutannya adalah:
- Parameter biasa
*args- Default parameters
**kwargs
Contoh:
def super_func(name, *args, i='hi', **kwargs):
pass
Struktur tersebut mengikuti urutan parameter yang benar.
Contoh Function Lengkap
Kita dapat menggabungkan seluruh konsep tersebut dalam satu function.
def super_func(name, *args, i='hi', **kwargs):
total = sum(args) + sum(kwargs.values())
return f'{i} {name}, totalnya adalah {total}'
Function dapat dipanggil seperti berikut:
result = super_func(
'Budi',
1,
2,
3,
num1=5,
num2=10
)
print(result)
Output:
hi Budi, totalnya adalah 21
Mari kita lihat bagaimana Python memproses argument tersebut.
name
↓
Budi
args
↓
(1, 2, 3)
i
↓
'hi'
kwargs
↓
{'num1': 5, 'num2': 10}
Kemudian:
sum(args)
= 1 + 2 + 3
= 6
dan:
sum(kwargs.values())
= 5 + 10
= 15
Sehingga:
6 + 15 = 21
Mengapa *args dan **kwargs Berguna?
Keduanya sangat berguna ketika function harus menerima jumlah argument yang fleksibel.
Tanpa *args, kita mungkin harus menentukan jumlah parameter secara eksplisit:
def calculate(num1, num2, num3, num4):
return num1 + num2 + num3 + num4
Function tersebut hanya menyediakan empat parameter.
Dengan *args:
def calculate(*numbers):
return sum(numbers)
Kita dapat memberikan jumlah angka yang berbeda:
print(calculate(1, 2))
print(calculate(1, 2, 3))
print(calculate(1, 2, 3, 4, 5))
Contoh Penggunaan **kwargs
**kwargs sangat berguna ketika data yang diterima memiliki struktur key-value yang fleksibel.
Contohnya:
def create_profile(**profile):
for key, value in profile.items():
print(f'{key}: {value}')
create_profile(
name='Budi',
age=25,
profession='Developer'
)
Output:
name: Budi
age: 25
profession: Developer
Function tersebut tidak perlu menentukan semua kemungkinan informasi profile sebagai parameter.
*args dan **kwargs dalam Praktik
Konsep ini banyak ditemukan dalam library dan framework Python karena memungkinkan function menerima konfigurasi atau argument yang fleksibel.
Contohnya, kita sering menemukan function dengan bentuk:
def some_function(*args, **kwargs):
pass
Artinya function tersebut dirancang untuk menerima positional arguments dan keyword arguments dalam jumlah yang fleksibel.
Hal yang Perlu Diingat
Beberapa poin penting:
*argsdigunakan untuk menerima banyak positional arguments.argsdisimpan dalam bentuk tuple.**kwargsdigunakan untuk menerima banyak keyword arguments.kwargsdisimpan dalam bentuk dictionary.- Nama
argsdankwargsmerupakan konvensi, bukan keyword khusus Python. - Simbol
*dan**merupakan bagian penting dari sintaks tersebut. *argscocok digunakan ketika jumlah positional arguments tidak diketahui.**kwargscocok digunakan ketika jumlah keyword arguments tidak diketahui.*argsdan**kwargsdapat digunakan bersama parameter biasa.- Urutan parameter harus mengikuti aturan Python agar function dapat didefinisikan dengan benar.
Ringkasan
Secara sederhana:
*args
↓
Banyak positional arguments
↓
Tuple
Sedangkan:
**kwargs
↓
Banyak keyword arguments
↓
Dictionary
Dengan memahami *args dan **kwargs, kita dapat membuat function yang lebih fleksibel dan mampu menerima berbagai bentuk input tanpa harus menentukan seluruh parameter secara eksplisit sejak awal.