Parameter menentukan data apa yang diterima sebuah fungsi, sedangkan argumen adalah nilai nyata yang dikirim pada saat pemanggilan. Topik ini membahas penyebutan argumen secara posisi dan kata kunci, pemberian nilai default pada parameter, serta jebakan mutable default, yaitu nilai default berupa objek yang dapat diubah dan berbagi keadaan antar pemanggilan. Pemahaman ini menjadi dasar desain antarmuka fungsi yang aman.
Argumen posisi dan argumen kata kunci#
Argumen posisi (positional argument) diikat ke parameter berdasarkan urutannya, sedangkan argumen kata kunci (keyword argument) disebut dengan nama parameternya dalam bentuk nama=nilai. Argumen kata kunci boleh ditulis dengan urutan bebas karena pengikatannya mengikuti nama, bukan posisi.
def perkenalan(nama, kota):
print(nama, "tinggal di", kota)
perkenalan("Ali", "Bandung")
perkenalan(kota="Surabaya", nama="Budi")Ali tinggal di Bandung
Budi tinggal di SurabayaPemanggilan pertama mengikat "Ali" ke nama dan "Bandung" ke kota secara posisi. Pemanggilan kedua menyebut keduanya sebagai argumen kata kunci dengan urutan terbalik, dan hasilnya sama karena pengikatan mengikuti nama. Kedua gaya boleh dicampur pada satu pemanggilan, tetapi argumen posisi wajib mendahului argumen kata kunci.
Penyebutan dengan nama menjaga pemanggilan yang panjang tetap terbaca, misalnya pada fungsi dengan banyak parameter angka atau pilihan. Nama parameter menjadi bagian dari antarmuka fungsi, sehingga perubahan namanya berdampak pada seluruh pemanggil yang menyebutnya.
Nama argumen kata kunci juga menaikkan mutu pemanggilan yang berisi banyak angka. Baris luas(5, lebar=3) menyatakan maksudnya secara langsung, sedangkan luas(5, 3) mengharuskan pembaca mencari definisinya terlebih dahulu. Pada parameter pilihan yang bersifat ya atau tidak, penyebutan dengan nama menghindarkan kesalahan urutan yang berdampak besar.
Nilai default pada parameter#
Parameter dapat diberi nilai default yang dipakai apabila pemanggil tidak mengirim argumen tersebut. Nilai default ditulis setelah nama parameter dengan tanda sama dengan, dan parameter yang sudah memiliki default menjadi opsional.
def sapa(nama, salam="Selamat pagi"):
print(salam + ",", nama)
sapa("Citra")
sapa("Dewi", "Selamat sore")Selamat pagi, Citra
Selamat sore, DewiPemanggilan pertama hanya mengisi nama, sehingga salam memakai defaultnya. Pemanggilan kedua mengganti salam dengan argumen posisi. Nilai default dievaluasi satu kali, yaitu pada saat def dijalankan, sehingga nilainya direkam lebih dulu dan tidak dibaca ulang pada setiap pemanggilan.
nilai_batas = 60
def status(nilai, batas=nilai_batas):
return "lulus" if nilai >= batas else "tidak lulus"
print(status(70))
nilai_batas = 80
print(status(70))lulus
lulusPanggilan kedua tetap melaporkan lulus karena batas masih memakai nilai 60 yang direkam ketika def dijalankan, meskipun nilai_batas sudah diubah menjadi 80. Apabila perilaku dinamis diinginkan, nilainya dikirim sebagai argumen atau dibaca ulang di dalam badan fungsi.
Nilai default sebaiknya hanya diberikan pada parameter yang nilainya memang sering sama di seluruh pemanggilan. Apabila nilainya berubah-ubah, menjadikan parameter wajib lebih aman karena setiap pemanggil dipaksa menimbang nilai yang dikirim. Urutannya pun tetap, yaitu parameter wajib mendahului parameter opsional, sehingga pemanggilan posisi tetap mudah dibaca.
Jebakan mutable default#
Nilai default yang berupa objek yang dapat diubah, seperti list atau dictionary, dinamakan mutable default. Objek tersebut dibuat satu kali pada saat def dijalankan, lalu dipakai ulang oleh seluruh pemanggilan yang tidak mengirim argumen tersebut. Perubahan yang dilakukan satu pemanggilan bertahan hingga pemanggilan berikutnya.
def tambah_tugas(tugas, daftar=[]):
daftar.append(tugas)
return daftar
print(tambah_tugas("kunci pintu"))
print(tambah_tugas("menyiram tanaman"))
print(tambah_tugas("cuci piring"))['kunci pintu']
['kunci pintu', 'menyiram tanaman']
['kunci pintu', 'menyiram tanaman', 'cuci piring']Daftar tugas bertambah setiap pemanggilan karena ketiga pemanggilan berbagi list yang sama. Perilaku ini bukan kekeliruan Python, melainkan konsekuensi evaluasi default yang dilakukan satu kali. Pola yang disarankan adalah memberi default None, lalu membuat list baru di dalam badan fungsi apabila argumennya tidak dikirim.
Jebakan ini tidak menimbulkan pesan error apa pun. Program tampak berjalan benar pada pemanggilan pertama, dan dampaknya baru terlihat pada pemanggilan berikutnya ketika objek lama sudah berubah. Karena itulah pola default None menjadi konvensi yang diterima luas di komunitas Python.
def tambah_tugas(tugas, daftar=None):
if daftar is None:
daftar = []
daftar.append(tugas)
return daftar
print(tambah_tugas("kunci pintu"))
print(tambah_tugas("menyiram tanaman"))['kunci pintu']
['menyiram tanaman']Dengan pola ini, setiap pemanggilan tanpa argumen kedua menerima list yang benar-benar baru, sedangkan pemanggilan yang mengirim list tetap menggunakan list tersebut. Uji kehadirannya memakai is None dan bukan perbandingan biasa, karena None adalah penanda tunggal yang tidak berubah.
Kesalahan umum#
Kesalahan pertama adalah memanggil fungsi dengan argumen yang kurang. Parameter tanpa default wajib diisi, dan kekurangan itu ditolak dengan error TypeError yang menyebut nama parameternya.
def luas(panjang, lebar):
return panjang * lebar
print(luas(5, lebar=3))
try:
luas(5)
except TypeError as e:
print(type(e).__name__, str(e))15
TypeError luas() missing 1 required positional argument: 'lebar'Pesan error menyebut lebar secara spesifik, sehingga pemanggil yang salah dapat diperbaiki dengan cepat. Pemanggilan pertama sah karena panjang diisi secara posisi dan lebar diisi dengan nama.
Kesalahan kedua adalah menaruh argumen posisi setelah argumen kata kunci pada satu pemanggilan. Bentuk itu ditolak Python sebagai SyntaxError sebelum program berjalan.
# tidak-dijalankan
luas(panjang=5, 3) # SyntaxError: argumen posisi setelah argumen kata kunciKesalahan ketiga adalah menulis parameter tanpa default setelah parameter yang memiliki default pada definisi fungsi. Urutan semacam itu juga ditolak sebagai SyntaxError, karena Python tidak dapat menentukan isi batas dari posisinya.
# tidak-dijalankan
def status(nilai=0, batas): # SyntaxError: parameter non-default mengikuti parameter default
return "x"Ringkasan#
- Argumen posisi terikat menurut urutan, sedangkan argumen kata kunci terikat menurut nama parameter dan boleh ditulis acak.
- Parameter dengan nilai default bersifat opsional, dan nilainya dievaluasi satu kali pada saat
defdijalankan. - Nilai default yang mutable dibagi antar pemanggilan, sehingga default
Nonediikuti pembuatan objek baru di dalam badan fungsi adalah pola yang aman. - Parameter tanpa default wajib diisi, dan kekurangan argumen ditolak dengan
TypeError.
Referensi#
- More Control Flow Tools — Python Software Foundation — Bagian tutorial resmi tentang nilai default dan argumen kata kunci.
- Calls — Python Software Foundation — Referensi bahasa tentang pengikatan argumen pada pemanggilan.
- Why are default values shared between objects? — Python Software Foundation — Penjelasan resmi FAQ tentang jebakan mutable default.