Parameter

Jenis parameter fungsi, nilai default, dan jebakan mutable default yang harus dihindari.

Daftar isi

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.

python Contoh: argumen posisi dan kata kunci
def perkenalan(nama, kota):
    print(nama, "tinggal di", kota)

perkenalan("Ali", "Bandung")
perkenalan(kota="Surabaya", nama="Budi")
text Keluaran
Ali tinggal di Bandung
Budi tinggal di Surabaya

Pemanggilan 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.

python Contoh: parameter dengan nilai default
def sapa(nama, salam="Selamat pagi"):
    print(salam + ",", nama)

sapa("Citra")
sapa("Dewi", "Selamat sore")
text Keluaran
Selamat pagi, Citra
Selamat sore, Dewi

Pemanggilan 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.

python Contoh: default direkam pada saat def
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))
text Keluaran
lulus
lulus

Panggilan 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.

python Contoh: mutable default berbagi satu objek
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"))
text Keluaran
['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.

python Contoh: perbaikan dengan default None
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"))
text Keluaran
['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.

python Contoh: argumen wajib yang kurang
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))
text Keluaran
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.

python
# tidak-dijalankan
luas(panjang=5, 3)   # SyntaxError: argumen posisi setelah argumen kata kunci

Kesalahan 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.

python
# 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 def dijalankan.
  • Nilai default yang mutable dibagi antar pemanggilan, sehingga default None diikuti pembuatan objek baru di dalam badan fungsi adalah pola yang aman.
  • Parameter tanpa default wajib diisi, dan kekurangan argumen ditolak dengan TypeError.

Referensi#