Nama parameter yang kita buat hari ini tidak selalu bertahan lama. Jika ratusan pemanggil menulis hitung(x=10), mengganti nama parameter x menjadi nilai merusak semuanya sekaligus. Sebaliknya, ada parameter yang lebih aman dipaksa lewat keyword agar pemanggilan tidak rancu. Python menyediakan dua penanda di signature — / dan * — yang membatasi cara tiap parameter boleh diisi. Kita sudah memakai hasil keduanya tanpa sadar lewat built-in seperti len(); sekarang kita belajar membuatnya sendiri.
Positional-Only dengan Penanda / #
Penanda garis miring (/) di daftar parameter menyatakan: semua parameter di kiri / hanya boleh diisi lewat posisi, tidak boleh lewat nama:
def pembagian(a, b, /):
return a / b
print(pembagian(10, 2))Output yang Dihasilkan:
5.0Mencoba mengisi parameter a atau b lewat keyword langsung ditolak interpreter Python dengan TypeError:
>>> def pembagian(a, b, /):
... return a / b
...
>>> pembagian(a=10, b=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: pembagian() got some positional-only arguments passed as keyword arguments: 'a, b'Kita sebenarnya sudah sering bertemu parameter semacam ini — function bawaan len() juga mendefinisikan parameternya sebagai positional-only:
>>> len(obj="kopi")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: len() takes no keyword argumentsMengapa pembuat library melakukan ini? Karena nama parameter menjadi detail internal, bukan janji publik. Implementasi len() bebas mengganti nama parameternya karena tidak ada pemanggil yang boleh bergantung pada nama tersebut. Penanda / memperkecil kontrak publik sebuah API: yang dijanjikan hanya posisinya.
Sudut pandang pemanggil pun ikut dijaga. Membaca pembagian(10, 2) sudah jelas tanpa mengetahui nama parameter — dua nilai dibandingkan secara matematis. Memaksa parameter semacam ini lewat keyword justru menambah kebisingan tanpa menambah informasi.
Keyword-Only dengan Penanda * #
Penanda bintang tunggal (*) bekerja arah sebaliknya: semua parameter di kanan * hanya boleh diisi lewat keyword. Pola ini paling berguna untuk parameter boolean atau opsi opsional:
def buat_koneksi(host, *, port=443, aman=True):
print(f"terhubung ke {host}:{port} (aman={aman})")
buat_koneksi("api.example.com")
buat_koneksi("api.example.com", port=8443, aman=False)Output yang Dihasilkan:
terhubung ke api.example.com:443 (aman=True)
terhubung ke api.example.com:8443 (aman=False)Parameter host diisi lewat posisi, sedangkan port dan aman wajib disebut namanya. Mengirim nilai posisi untuk port ditolak — interpreter Python menghitung argument posisi yang masuk dan menemukan kelebihan:
>>> def buat_koneksi(host, *, port=443):
... print(f"terhubung ke {host}:{port}")
...
>>> buat_koneksi("api.example.com", 8443)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: buat_koneksi() takes 1 positional argument but 2 were givenDua manfaat langsung dari keyword-only: pemanggilan menjadi jelas (aman=False lebih terbaca daripada argumen ketiga bertipe bool), dan penambahan parameter baru di kanan * tidak akan menggeser makna pemanggilan lama yang sudah ada. Bayangkan buat_koneksi kelak menambah parameter timeout: karena semua opsi berada di zona keyword-only, pemanggilan lama tetap valid tanpa satu perubahan pun.
Ketiga Zona dalam Satu Signature #
Penanda / dan * boleh hadir bersama, membagi daftar parameter menjadi tiga zona berurutan:
def nama_fungsi(positional_only, /, campuran, *, keyword_only):Contoh penerapannya dalam satu function nyata:
def format_harga(nilai, /, mata_uang="Rp", *, pemisah="."):
return f"{mata_uang}{nilai:,}".replace(",", pemisah)
print(format_harga(1500000))
print(format_harga(1500000, "$"))
print(format_harga(1500000, "$", pemisah=","))Output yang Dihasilkan:
Rp1.500.000
$1.500.000
$1,500,000Mari kita telaah pemanggilan ketiga pada contoh di atas: format_harga(1500000, "$", pemisah=",") mengisi nilai lewat posisi (zona /), mata_uang lewat posisi juga (zona tengah bebas dua cara), dan pemisah lewat keyword — satu-satunya cara yang dibolehkan zona *.
Zona mana yang dipilih untuk tiap parameter? Pedoman praktisnya:
| Zona | Penanda | Cocok untuk |
|---|---|---|
| Positional-only | sebelum / | parameter teknis yang maknanya jelas dari posisi: nilai, angka |
| Campuran | antara / dan * | parameter utama yang wajar ditulis dua cara |
| Keyword-only | setelah * | opsi boolean, nilai tuning, parameter yang rentan rancu urutannya |