Rantai if/elif yang membandingkan satu variabel berulang kali cepat terasa repetitif: cek perintah == "start", lalu perintah == "stop", lalu perintah == "help". Lebih dari itu, data nyata sering berbentuk struktur — tuple berisi aksi dan nominal, dictionary berisi pesan terstruktur — yang biasanya harus dibongkar manual sebelum bisa diperiksa. Python 3.10 menjawab kedua masalah tersebut dengan pernyataan match dan klausa case: structural pattern matching yang mencocokkan nilai sekaligus strukturnya. Pada Chapter ini kita pelajari pola literal, guard, pola sequence dan mapping, sampai sekilas class pattern.
Pola Literal dan Wildcard #
Pernyataan match diikuti sebuah subjek, lalu daftar klausa case berisi pola. Interpreter Python membandingkan subjek dengan tiap pola dari atas ke bawah dan mengeksekusi blok pola pertama yang cocok — klausa lainnya dilewati:
def jalankan(perintah):
match perintah:
case "start":
return "Server dinyalakan"
case "stop":
return "Server dimatikan"
case "help":
return "Perintah tersedia: start, stop, help"
case _:
return "Perintah tidak dikenali"
for perintah in ["start", "help", "hapus"]:
print(perintah, "->", jalankan(perintah))Output yang Dihasilkan:
start -> Server dinyalakan
help -> Perintah tersedia: start, stop, help
hapus -> Perintah tidak dikenaliMari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 2 (
match perintah:): variabelperintahmenjadi subjek yang dicocokkan terhadap tiap pola. - Baris 3 (
case "start":): pola literal — cocok hanya bila subjek sama dengan string"start". - Baris 9 (
case _:): underscore adalah wildcard yang cocok dengan nilai apa pun, berperan sepertielsesebagai penampung terakhir.
Tidak ada fallthrough seperti switch di C atau PHP: begitu satu pola cocok, klausa berikutnya tidak diperiksa sama sekali, dan break tidak diperlukan.
Guard: Pola dengan Syarat Tambahan #
Klausa case menerima guard berbentuk case <pola> if <kondisi>. Pola harus cocok dan kondisi harus bernilai True sebelum bloknya dieksekusi — inilah cara match menangani rentang nilai yang tidak bisa dinyatakan pola literal:
def kategorikan(suhu):
match suhu:
case n if n < 0:
return "Sangat dingin: di bawah titik beku"
case n if n <= 30:
return "Suasana nyaman"
case _:
return "Panas, siapkan air minum"
print(kategorikan(-5))
print(kategorikan(25))
print(kategorikan(35))Output yang Dihasilkan:
Sangat dingin: di bawah titik beku
Suasana nyaman
Panas, siapkan air minumPada case n if n < 0:, variabel n mengikat nilai subjek, lalu guard n < 0 dievaluasi. Untuk kategorikan(25), pola pertama cocok secara struktur (semua angka mengikat ke n) tetapi guard-nya gagal, sehingga pemeriksaan lanjut ke klausa berikutnya.
Pola Sequence dan Mapping #
Kekuatan sebenarnya match bukan mencocokkan nilai tunggal, melainkan struktur data. Pola sequence membongkar tuple atau list; pola mapping mencocokkan dictionary berdasarkan key yang disebutkan:
pesan_transfer = ("transfer", 150000)
pesan_tarik = {"aksi": "tarik", "jumlah": 50000}
match pesan_transfer:
case ("transfer", jumlah):
print(f"Transfer sebesar Rp{jumlah}")
match pesan_tarik:
case {"aksi": "tarik", "jumlah": jumlah}:
print(f"Penarikan sebesar Rp{jumlah}")Output yang Dihasilkan:
Transfer sebesar Rp150000
Penarikan sebesar Rp50000Mari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 5 (
case ("transfer", jumlah):): pola sequence dengan dua elemen — cocok bila subjek adalah sequence dua elemen yang elemen pertamanya"transfer"; elemen kedua diikat ke variabeljumlah. - Baris 9 (
case {"aksi": "tarik", "jumlah": jumlah}:): pola mapping — cocok bila subjek adalah dictionary yang memiliki key"aksi"bernilai"tarik"dan key"jumlah"dengan nilai apa pun yang diikat kejumlah.
Pembongkaran seperti ini tanpa match membutuhkan pengecekan panjang, pengambilan elemen [0], dan pengambilan key secara manual — tiga langkah yang kini menyatu dalam satu pola.
Class Pattern Secara Singkat #
Pola juga dapat mencocokkan tipe dengan class pattern NamaClass(). Pemakaian ringkasnya adalah membedakan tipe data sebelum memprosesnya:
def tampilkan(nilai):
match nilai:
case str():
print("String:", nilai)
case int() | float():
print("Angka:", nilai)
case _:
print("Tipe lain:", repr(nilai))
tampilkan("Budi")
tampilkan(42)
tampilkan(3.5)
tampilkan([1, 2])Output yang Dihasilkan:
String: Budi
Angka: 42
Angka: 3.5
Tipe lain: [1, 2]Pola str() cocok hanya untuk string, dan tanda pipa | menggabungkan beberapa pola alternatif menjadi satu klausa. Class pattern penuh — termasuk pencocokan attribute object — kita bahas saat bertemu class pada Section Object-Oriented Programming.
Bukan switch Statement #
Pedoman memilih antara keduanya:
| Situasi | Pilihan tepat |
|---|---|
Rentang nilai atau kondisi bebas (nilai >= 80) | if/elif |
| Kondisi melibatkan beberapa variabel berbeda | if/elif |
| Mencocokkan satu variabel ke banyak nilai pasti | match-case |
| Membongkar isi tuple, list, atau dictionary | match-case |
| Kompatibilitas Python di bawah 3.10 wajib | if/elif |
Dengan match-case, kotak perkakas control flow Python lengkap. Chapter penutup section ini merangkum cara memilih struktur yang tepat untuk setiap masalah.