match / case (3.10+)

Structural pattern matching dengan match/case dan kapan pendekatan ini lebih tepat daripada if.

Daftar isi

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.

python Contoh: pola literal, pola or, dan wildcard
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}")
text Keluaran
nomor Z7 menuju kode tidak dikenal

Pola "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.

python Contoh: pola list dengan capture pattern
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")
text Keluaran
menjalankan backup sebanyak 3 kali

Pola ["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.

python Contoh: pola dictionary
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")
text Keluaran
PERINGATAN: suhu tinggi

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

python layanan-loket.py
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}")
text Keluaran
nomor B2 menuju pengambilan paket

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

bash
# menjalankan program penerjemah kode loket
python3 layanan-loket.py
text Keluaran
nomor B2 menuju pengambilan paket

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

SituasiPilihan yang tepat
Satu nilai dibandingkan dengan beberapa alternatif literalmatch dengan pola literal atau pola or
Struktur list atau dictionary perlu diperiksa dan diurai sekaligusmatch dengan pola struktur
Kondisi berupa rentang nilai, misalnya predikat A sampai Drantai if/elif
Kondisi menggabungkan beberapa variabel dengan and atau orrantai 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.

python Contoh: nama pola polos menimpa isi variabel
batas = 100
nilai = 42
match nilai:
    case batas:
        print("pola cocok, batas kini berisi", batas)
text Keluaran
pola cocok, batas kini berisi 42

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

python Contoh: match tanpa wildcard lewat dalam diam
kode = "Z9"
match kode:
    case "A1":
        print("cetak dokumen")
print("eksekusi berlanjut tanpa pesan")
text Keluaran
eksekusi berlanjut tanpa pesan

Letakkan klausa case _: di akhir setiap match yang subjeknya tidak dapat dipastikan, sehingga jalur yang tidak terduga tetap mendapat penanganan yang jelas.

Ringkasan#

  • Pernyataan match menguji satu subjek terhadap pola-pola pada klausa case, 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.
  • match paling tepat untuk alternatif diskrit dan penguraian struktur, sedangkan rentang nilai dan gabungan kondisi tetap wilayah if/elif.

Referensi#