Menu

*args dan **kwargs di Python: argumen posisional dan keyword yang fleksibel

Arti *args dan **kwargs, kapan memakainya, dan cara meneruskan argumen dengan rapi dari satu fungsi ke fungsi lain.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Saat kamu tidak tahu berapa banyak argumennya

Kebanyakan fungsi menerima jumlah parameter yang tetap. Tapi sesekali kamu butuh sesuatu yang lebih fleksibel: logger yang menerima pesan berapa pun jumlahnya, fungsi pembungkus yang meneruskan apa pun yang diterimanya ke fungsi lain, atau fungsi untuk membuat grafik yang menerima konfigurasi tanpa tahu opsi mana yang akan dipakai pemanggilnya.

Python menangani ini dengan dua penanda khusus di daftar parameter: *args dan **kwargs.

*args mengumpulkan argumen posisional

Satu tanda bintang berarti "kemas semua argumen posisional tambahan ke dalam sebuah tuple":

Di dalam fungsi, args adalah tuple biasa. Kamu bisa melakukan perulangan di atasnya, mengambil elemennya lewat indeks, mengirimkannya ke len(), atau mengambil potongannya (slicing).

*args biasanya muncul bersama parameter yang diberi nama:

first mengambil argumen pertama, lalu *rest mengemas semua yang ada setelahnya ke dalam sebuah tuple.

**kwargs mengumpulkan argumen keyword

Dua tanda bintang melakukan hal yang sama untuk argumen keyword, dan mengemasnya ke dalam sebuah dict:

Di dalam describe, kwargs adalah dict biasa. Key-nya adalah nama keyword dalam bentuk string.

Memakai keduanya sekaligus

Kamu bisa memakai keduanya di fungsi yang sama. Konvensinya, *args ditulis sebelum **kwargs:

Urutan lengkap parameter, dari kiri ke kanan:

  1. Parameter posisional biasa (wajib atau dengan nilai default).
  2. *args.
  3. Parameter keyword-only (semua yang ada setelah *args harus dikirim dengan keyword).
  4. **kwargs.

title mengambil argumen posisional pertama. Sisa argumen posisional masuk ke tags. draft harus dikirim dengan keyword (karena posisinya setelah *tags). Argumen keyword lainnya masuk ke metadata.

Membongkar dengan * dan ** saat memanggil fungsi

Tanda bintang juga bekerja ke arah sebaliknya: menyebarkan sebuah sequence atau dict menjadi argumen sebuah pemanggilan:

Ini sangat berguna untuk meneruskan argumen:

wrapped tidak perlu tahu argumen apa yang diharapkan log. Ia cukup mengumpulkan semuanya lalu meneruskannya. Pola ini sering sekali muncul di decorator (topik yang lebih lanjut) dan fungsi pembungkus.

Kapan *args dan **kwargs bukan pilihan yang tepat

Gampang sekali terlalu bersemangat lalu memakainya di mana-mana. Ada dua peringatan:

Keduanya menyembunyikan apa yang diharapkan sebuah fungsi

Kalau setiap fungsi di kodemu berbentuk def f(*args, **kwargs), kode yang memanggilnya tidak tahu argumen apa yang valid. Pakai parameter bernama selama bisa, dan biarkan *args/**kwargs hanya membawa input yang memang jumlahnya tidak tetap atau yang hanya diteruskan.

Pesan error jadi kabur

Nama keyword yang salah ketik berubah menjadi None yang diam-diam atau KeyError jauh di dalam fungsi, bukannya langsung memunculkan "unexpected keyword argument" di tempat pemanggilan. Parameter bernama memberimu umpan balik yang jauh lebih baik.

Aturannya: pakai parameter bernama secara default, dan gunakan *args/**kwargs hanya kalau fungsinya memang fleksibel atau meneruskan argumen ke callable lain.

Contoh praktis kecil

Sebuah fungsi bantu bergaya fungsi grafik yang membungkus fungsi pihak ketiga dengan beberapa nilai default:

*values membuat pemanggil bisa mengirim item berapa pun jumlahnya, sedangkan **style menampung konfigurasi tambahan tanpa mengharuskan setiap opsi menjadi parameter bernama. Fungsi ini fleksibel tapi tetap mudah dipahami, karena logika di dalamnya memperlihatkan dengan jelas key apa saja yang dibacanya dari style.

Rangkuman

  • *args mengemas argumen posisional tambahan ke dalam sebuah tuple.
  • **kwargs mengemas argumen keyword tambahan ke dalam sebuah dict.
  • Saat memanggil fungsi, *seq dan **dict membongkar ke arah sebaliknya.
  • Parameter harus muncul dengan urutan: biasa → *args → keyword-only → **kwargs.
  • Jangan berlebihan: parameter bernama lebih jelas kalau bisa dipakai.

Berikutnya: lambda, cara menulis fungsi kecil sekali pakai langsung di tempat.

Pertanyaan yang sering diajukan

Apa itu *args di Python?

*args mengumpulkan semua argumen posisional tambahan ke dalam sebuah tuple. Dengan def f(*args): kamu bisa memanggil f(1, 2, 3) dan menerima args sebagai (1, 2, 3). Nama args hanya konvensi: kamu bisa menamainya apa saja, tapi semua orang memakai *args.

Apa itu **kwargs di Python?

**kwargs mengumpulkan semua argumen keyword tambahan ke dalam sebuah dict. Dengan def f(**kwargs): kamu bisa memanggil f(name='Ada', age=30) dan menerima kwargs sebagai {'name': 'Ada', 'age': 30}. Bersama-sama, *args dan **kwargs membuat sebuah fungsi bisa menerima kombinasi argumen apa pun.

Apakah namanya harus args dan kwargs?

Tidak, yang penting adalah tanda bintangnya, bukan namanya. *values dan **options bekerja persis sama. Tapi args dan kwargs adalah konvensi yang dipakai hampir di semua kode Python, jadi pakai saja nama itu kecuali ada alasan khusus untuk memilih nama yang lebih deskriptif.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai