Sejak Python 3.10, bahasa ini menyediakan pernyataan match untuk structural pattern matching, yaitu pencocokan pola terhadap struktur dan nilai data. Topik ini membahas pola literal, capture pattern, pola or, serta pola sederhana atas list dan dictionary, ditutup dengan panduan memilih antara match dan rantai if/elif. Seluruh contoh dijalankan pada Python 3.12, sehingga pola yang tersedia sejak 3.10 dapat direproduksi apa adanya.
Sintaks dasar match dan case#
Pernyataan match menguji satu ekspresi yang disebut subjek terhadap serangkaian pola pada klausa case. Pola diperiksa berurutan dari atas ke bawah, dan hanya blok milik pola pertama yang cocok dijalankan, tanpa mekanisme fall-through seperti pada sebagian bahasa lain. Tanda _ adalah pola kartu bebas (wildcard) yang mencocokkan apa pun, lazimnya diletakkan paling akhir sebagai jalur bawaan. Bentuknya mengikuti aturan blok Python yang sama dengan percabangan, yaitu titik dua di akhir baris dan penjorokan empat spasi.
kode = "Z7"
match kode:
case "A1":
layanan = "cetak dokumen"
case "B1" | "B2":
layanan = "pengambilan paket"
case _:
layanan = "kode tidak dikenal"
print(f"nomor {kode} menuju {layanan}")nomor Z7 menuju kode tidak dikenalPola "A1" dan "B1" adalah pola literal yang membandingkan subjek dengan nilai yang tertulis. Tanda | membentuk pola or, yakni pola yang cocok apabila salah satu alternatifnya cocok, sehingga dua kode layanan dapat digabung dalam satu klausa. Subjek Z7 tidak cocok dengan kedua klausa literal, sehingga jatuh ke klausa wildcard dan mendapat jalur bawaan.
Pola list dan dictionary#
Pola tidak berhenti pada nilai tunggal. Pola list menuliskan bentuk urutan yang diharapkan, lengkap dengan jumlah posisinya, sedangkan pola dictionary menuliskan kunci yang wajib ada. Bagian yang ditulis sebagai nama polos adalah capture pattern, yaitu pola yang menambatkan nilai pada posisi itu ke sebuah variabel. Pencocokan berlangsung sekaligus dengan penguraian struktur, sehingga satu klausa dapat menggantikan beberapa baris perbandingan dan penyalinan nilai.
perintah = ["jalankan", "backup", 3]
match perintah:
case ["hentikan"]:
print("program dihentikan")
case ["jalankan", nama, jumlah]:
print(f"menjalankan {nama} sebanyak {jumlah} kali")
case _:
print("perintah tidak dikenal")menjalankan backup sebanyak 3 kaliPola ["jalankan", nama, jumlah] menuntut list berisi tepat tiga item dengan item pertama berupa string "jalankan". Nilai pada posisi kedua dan ketiga ditambatkan ke nama dan jumlah sekaligus. Apabila panjang listnya berbeda, pola ini tidak cocok dan pencarian berlanjut ke klausa berikutnya.
Pola dictionary bekerja serupa, tetapi hanya menuntut keberadaan kunci yang disebutkan, sedangkan kunci tambahan tidak menghalangi kecocokan.
pesan = {"jenis": "peringatan", "isi": "suhu tinggi"}
match pesan:
case {"jenis": "error", "isi": isi}:
print("ERROR:", isi)
case {"jenis": "peringatan", "isi": isi}:
print("PERINGATAN:", isi)
case _:
print("pesan lain")PERINGATAN: suhu tinggiNilai milik kunci "jenis" dicocokkan dengan pola literalnya, sedangkan nilai milik kunci "isi" ditambatkan ke isi. Sifat ini menjadikan match ringkas untuk memilah data dictionary yang kuncinya dikenal, misalnya pesan atau konfigurasi. Pada pesan yang menyimpan kunci tambahan seperti waktu kedaluwarsa, hasilnya tetap sama.
Contoh program utuh: menerjemahkan kode loket#
Program berikut memadukan pola literal, pola or, dan wildcard untuk menerjemahkan kode nomor antrean menjadi nama layanan. Susunan klausanya berurutan dari yang paling spesifik ke wildcard, sehingga setiap kode baru cukup ditambahkan sebagai satu klausa.
kode = "B2"
match kode:
case "A1":
layanan = "cetak dokumen"
case "B1" | "B2":
layanan = "pengambilan paket"
case "C1" | "C2" | "C3":
layanan = "pembayaran tagihan"
case _:
layanan = "kode tidak dikenal"
print(f"nomor {kode} menuju {layanan}")nomor B2 menuju pengambilan paketSubjek B2 gagal pada klausa pertama, lalu cocok dengan salah satu alternatif pola or pada klausa kedua, sehingga klausa di bawahnya tidak diperiksa lagi. Kode yang tidak terdaftar, misalnya Z9, jatuh ke wildcard dan menghasilkan pesan kode tidak dikenal. Simpan berkas di atas di direktori kerja, lalu jalankan dengan perintah berikut.
# menjalankan program penerjemah kode loket
python3 layanan-loket.pynomor B2 menuju pengambilan paketKapan match lebih tepat daripada if#
Pernyataan match mengungguli rantai if/elif pada dua situasi. Pertama, apabila satu nilai dibandingkan dengan banyak alternatif diskrit, pola or menggabungkan alternatif tersebut tanpa menulis ulang variabelnya pada setiap baris. Kedua, apabila data yang diterima beraneka bentuk, pola list dan dictionary memeriksa struktur sekaligus mengurai isinya dalam satu langkah, sesuatu yang tidak dapat dilakukan perbandingan == biasa tanpa kode tambahan. Sebaliknya, kondisi berupa rentang nilai atau gabungan beberapa variabel tetap paling jelas sebagai if/elif, karena pola tidak dirancang untuk membandingkan angka dengan batas atas dan batas bawah sekaligus.
| Situasi | Pilihan yang tepat |
|---|---|
| Satu nilai dibandingkan dengan beberapa alternatif literal | match dengan pola literal atau pola or |
| Struktur list atau dictionary perlu diperiksa dan diurai sekaligus | match dengan pola struktur |
| Kondisi berupa rentang nilai, misalnya predikat A sampai D | rantai if/elif |
Kondisi menggabungkan beberapa variabel dengan and atau or | rantai if/elif |
Pernyataan match juga menyediakan guard, yaitu syarat tambahan setelah pola yang ditulis seperti case n if n > 100:. Guard menutup sebagian kebutuhan kondisi rentang, tetapi rantai if/elif tetap lebih terbaca untuk kebutuhan itu. Pilihan terbaik ditentukan oleh bentuk data yang ditangani, bukan oleh kebiasaan.
Kesalahan umum#
Kesalahan pertama adalah menganggap nama pola polos sebagai perbandingan dengan variabel yang sudah ada. Nama polos selalu berperan sebagai capture pattern yang menambatkan nilai subjek, bahkan apabila nama itu sudah dipakai di atasnya, sehingga isi variabel lama tertimpa tanpa peringatan. Perilaku ini menjadikan pola capture sebagai alat pengurai nilai, bukan alat perbandingan.
batas = 100
nilai = 42
match nilai:
case batas:
print("pola cocok, batas kini berisi", batas)pola cocok, batas kini berisi 42Pola batas bukan berarti pencocokan dengan nilai batas saat ini, yaitu 100, melainkan penambatan nilai subjek ke nama batas. Karena subjeknya 42, isi batas berubah menjadi 42 dan kecocokan selalu berhasil. Untuk membandingkan dengan nilai yang sudah ada, tulis nilainya sebagai pola literal atau tambahkan guard, misalnya case n if n == batas:.
Kesalahan kedua adalah mengira match yang tidak menemukan pola cocok akan melaporkan error. Tanpa klausa wildcard, subjek yang tidak cocok dibiarkan lewat dalam diam, dan eksekusi berlanjut ke baris setelah match. Keheningan itu wajar untuk kasus yang memang membiarkan nilai lain lewat, tetapi berbahaya apabila setiap nilai seharusnya ditangani.
kode = "Z9"
match kode:
case "A1":
print("cetak dokumen")
print("eksekusi berlanjut tanpa pesan")eksekusi berlanjut tanpa pesanLetakkan klausa case _: di akhir setiap match yang subjeknya tidak dapat dipastikan, sehingga jalur yang tidak terduga tetap mendapat penanganan yang jelas.
Ringkasan#
- Pernyataan
matchmenguji satu subjek terhadap pola-pola pada klausacase, dan hanya pola pertama yang cocok dijalankan. - Pola literal membandingkan nilai, tanda
|menggabungkan alternatif dalam pola or, sedangkan_mencocokkan apa pun. - Pola list dan dictionary memeriksa struktur sekaligus menambatkan bagian-bagiannya melalui capture pattern.
matchpaling tepat untuk alternatif diskrit dan penguraian struktur, sedangkan rentang nilai dan gabungan kondisi tetap wilayahif/elif.
Referensi#
- PEP 634 — Python Software Foundation — Spesifikasi resmi structural pattern matching beserta seluruh pola yang didukung.
- PEP 636 — Python Software Foundation — Tutorial resmi penulisan match/case dengan contoh bertahap.
- The match statement — Python Software Foundation — Referensi bahasa untuk sintaks pernyataan match dan case.