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:

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

text
start -> Server dinyalakan
help -> Perintah tersedia: start, stop, help
hapus -> Perintah tidak dikenali

Mari kita telaah apa yang terjadi pada baris-baris kode di atas:

  1. Baris 2 (match perintah:): variabel perintah menjadi subjek yang dicocokkan terhadap tiap pola.
  2. Baris 3 (case "start":): pola literal — cocok hanya bila subjek sama dengan string "start".
  3. Baris 9 (case _:): underscore adalah wildcard yang cocok dengan nilai apa pun, berperan seperti else sebagai 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:

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

text
Sangat dingin: di bawah titik beku
Suasana nyaman
Panas, siapkan air minum

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

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

text
Transfer sebesar Rp150000
Penarikan sebesar Rp50000

Mari kita telaah apa yang terjadi pada baris-baris kode di atas:

  1. 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 variabel jumlah.
  2. 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 ke jumlah.

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:

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

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

SituasiPilihan tepat
Rentang nilai atau kondisi bebas (nilai >= 80)if/elif
Kondisi melibatkan beberapa variabel berbedaif/elif
Mencocokkan satu variabel ke banyak nilai pastimatch-case
Membongkar isi tuple, list, atau dictionarymatch-case
Kompatibilitas Python di bawah 3.10 wajibif/elif

Dengan match-case, kotak perkakas control flow Python lengkap. Chapter penutup section ini merangkum cara memilih struktur yang tepat untuk setiap masalah.