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:

python
def pembagian(a, b, /):
    return a / b

print(pembagian(10, 2))

Output yang Dihasilkan:

text
5.0

Mencoba mengisi parameter a atau b lewat keyword langsung ditolak interpreter Python dengan TypeError:

python
>>> 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:

python
>>> len(obj="kopi")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: len() takes no keyword arguments

Mengapa 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:

python
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:

text
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:

python
>>> 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 given

Dua 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:

text
def nama_fungsi(positional_only, /, campuran, *, keyword_only):

Contoh penerapannya dalam satu function nyata:

python
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:

text
Rp1.500.000
$1.500.000
$1,500,000

Mari 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:

ZonaPenandaCocok untuk
Positional-onlysebelum /parameter teknis yang maknanya jelas dari posisi: nilai, angka
Campuranantara / dan *parameter utama yang wajar ditulis dua cara
Keyword-onlysetelah *opsi boolean, nilai tuning, parameter yang rentan rancu urutannya