Sebuah function penerima notifikasi mungkin butuh sepuluh pengaturan, padahal sembilan di antaranya hampir selalu memakai nilai yang sama. Memaksa setiap pemanggil mengirim sepuluh argument membuat kode yang seharusnya satu baris menjadi riuh. Default parameter menyelesaikannya: parameter yang tidak dikirim nilai otomatis memakai nilai bawaan yang ditetapkan saat definisi. Chapter ini membahas cara kerjanya, urutan wajibnya, dan satu jebakan klasik yang wajib dipahami sebelum menulis function sesungguhnya.
Parameter dengan Nilai Bawaan #
Nilai bawaan ditulis dengan tanda = langsung di dalam baris def. Pemanggil boleh melewatkan parameter tersebut, dan nilai bawaan yang dipakai:
def sapa(nama, salam="Halo"):
print(f"{salam}, {nama}!")
sapa("Budi")
sapa("Siti", "Selamat pagi")Output yang Dihasilkan:
Halo, Budi!
Selamat pagi, Siti!Mari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 1 (
def sapa(nama, salam="Halo"):): parameternamawajib diisi; parametersalammemiliki nilai bawaan"Halo". - Baris 4 (
sapa("Budi")): hanya satu argument dikirim, sehingga argument tersebut masuk ke parameter pertamanama. Parametersalammemakai nilai bawaan"Halo". - Baris 5 (
sapa("Siti", "Selamat pagi")): dua argument dikirim, nilai bawaansalamtertimpa dengan"Selamat pagi".
Nilai bawaan juga boleh ditimpa lewat keyword argument, misalnya sapa("Budi", salam="Selamat malam") — sesuai aturan pencampuran pada Chapter Positional dan Keyword Arguments.
Parameter Berbawaan Wajib di Belakang #
Interpreter Python menolak definisi yang menempatkan parameter wajib setelah parameter berbawaan. Aturan ini menjaga pemasangan posisi tetap masuk akal: sekali sebuah parameter bisa dilewati, semua parameter setelahnya harus bisa dilewati juga:
>>> def sapa(salam="Halo", nama):
File "<stdin>", line 1
def sapa(salam="Halo", nama):
^^^^
SyntaxError: parameter without a default follows parameter with a defaultPesan galat ini muncul langsung saat definisi dibaca — program bahkan belum sempat berjalan. Perbaikannya sederhana: pindahkan nama ke depan, def sapa(nama, salam="Halo").
Nilai Bawaan Dievaluasi Sekali #
Di sinilah letak jebakan terkenal Python. Ekspresi nilai bawaan dievaluasi satu kali, tepat ketika statement def dieksekusi — bukan setiap kali function dipanggil. Untuk nilai immutable seperti string dan angka, perilaku ini tidak terlihat. Untuk object mutable seperti list, satu evaluasi berarti satu object yang sama dipakai bersama seluruh pemanggilan:
def tambah_item(nama, keranjang=[]):
keranjang.append(nama)
return keranjang
print(tambah_item("roti"))
print(tambah_item("telur"))
print(tambah_item("susu"))Output yang Dihasilkan:
['roti']
['roti', 'telur']
['roti', 'telur', 'susu']Pemanggil kedua seharusnya menerima keranjang kosong, tetapi hasilnya berisi "roti" dari pemanggil pertama. Penyebabnya: list [] dibuat satu kali saat def dieksekusi; setiap pemanggilan tanpa argument keranjang menerima list yang sama. Statement append() lalu menumpuk item di dalam object bersama tersebut.
Solusi: Sentinel None #
Idiom baku Python untuk kasus ini adalah nilai bawaan None, lalu membuat list baru di dalam badan function:
def tambah_item(nama, keranjang=None):
if keranjang is None:
keranjang = []
keranjang.append(nama)
return keranjang
print(tambah_item("roti"))
print(tambah_item("telur"))
belanja = ["beras"]
print(tambah_item("gula", belanja))Output yang Dihasilkan:
['roti']
['telur']
['beras', 'gula']Mari kita telaah baris-baris kuncinya:
- Baris 1 (
def tambah_item(nama, keranjang=None):): nilai bawaan kiniNone— object singleton immutable yang aman dibagikan karena tidak pernah dimutasi. - Baris 2-3 (
if keranjang is None:): pemeriksaanis None(bukan== None, sesuai pembahasan pada Chapter None dan None Type) mendeteksi pemanggilan yang tidak mengirim argument. List segar dibuat untuk pemanggilan tersebut. - Baris 9 (
print(tambah_item("gula", belanja))): pemanggil yang benar-benar mengirim list memakai list tersebut — item"gula"ditambahkan ke listbelanjamilik pemanggil.
Hasilnya, setiap pemanggilan tanpa argument mendapat keranjang kosong yang segar, sementara pemanggil yang mengirim list tetap bekerja normal.
Pola keranjang=None ini akan terus muncul di library Python maupun kode industri. Kenali polanya sekali sekarang, dan kita tidak akan pernah terkejut oleh keranjang yang “berhantu” di chapter-chapter berikutnya.