Guido van Rossum mengusulkan penambahan operator pencocokan pola ke Python

Guido van Rossum diperkenalkan rancangan untuk tinjauan komunitas spesifikasi untuk mengimplementasikan operator pencocokan pola (match and case) dengan Python. Perlu dicatat bahwa proposal untuk menambahkan operator pencocokan pola telah dipublikasikan pada tahun 2001 dan 2006 (semangat-0275, semangat-3103), tetapi ditolak demi mengoptimalkan konstruksi “if…elif…else” untuk menyusun rantai yang cocok.

Implementasi baru ini mirip dengan operator "match" yang disediakan di Scala, Rust, dan F#, yang membandingkan hasil ekspresi tertentu dengan daftar pola yang tercantum dalam blok berdasarkan operator "case". Berbeda dengan operator "switch" yang tersedia di C, Java, dan JavaScript, ekspresi berbasis "match" menawarkan lebih banyak hal fungsionalitas yang luas. Perlu dicatat bahwa operator yang diusulkan akan meningkatkan keterbacaan kode, menyederhanakan perbandingan objek Python sewenang-wenang dan debugging, dan juga meningkatkan keandalan kode berkat kemungkinan diperpanjang pemeriksaan tipe statis.

def http_kesalahan(status):
status pertandingan:
kasus 400:
kembalikan "Permintaan buruk"
kasus 401|403|404:
kembali "Tidak diizinkan"
kasus 418:
kembali "Aku adalah teko"
kasus_:
kembalikan "Sesuatu yang lain"

Misalnya, Anda bisa membongkar objek, tupel, daftar, dan urutan arbitrer untuk mengikat variabel berdasarkan nilai yang ada. Diperbolehkan untuk menentukan templat bertingkat, menggunakan kondisi “jika” tambahan dalam templat, menggunakan masker (“[x, y, *rest]”), pemetaan kunci/nilai (misalnya, {“bandwidth”: b, “latensi ”: l} untuk mengekstrak nilai dan kamus "bandwidth" dan "latensi", mengekstrak subtemplat (":=" operator), menggunakan konstanta bernama dalam templat. Di kelas, dimungkinkan untuk menyesuaikan perilaku pencocokan menggunakan metode “__match__()”.

dari kelas data impor kelas data

@dataclass
kelas Poin:
x:int
kamu:int

def dimana(titik):
titik pertandingan:
Poin kasus (0, 0):
mencetak("Asal")
kasus Poin (0, y):
mencetak(f"Y={y}")
Kasus Poin (x, 0):
mencetak(f"X={x}")
Poin kasus():
mencetak("Di tempat lain")
kasus_:
print("Tidak ada poin")

titik pertandingan:
kasus Titik(x, y) jika x == y:
mencetak(f"Y=X pada {x}")
Kasus Poin (x, y):
print(f"Tidak pada diagonal")

MERAH, HIJAU, BIRU = 0, 1, 2
warna sama:
kasus .MERAH:
print("Saya melihat warna merah!")
kasus .HIJAU:
print("Rumput berwarna hijau")
kasus .BLU
E:
print(“Saya merasa sedih :(“)

Satu set telah disiapkan untuk ditinjau tambalan dengan eksperimental penerapan spesifikasi yang diusulkan, tetapi versi finalnya masih ada dibahas. Misalnya, ditawarkan Alih-alih ekspresi "case _:" untuk nilai default, gunakan kata kunci "else:" atau "default:", karena "_" dalam konteks lain digunakan sebagai variabel sementara. Yang juga dipertanyakan adalah organisasi internal, yang didasarkan pada penerjemahan ekspresi baru ke dalam bytecode yang mirip dengan yang digunakan untuk konstruksi "if...elif...else", yang tidak akan memberikan kinerja yang diinginkan saat memproses kumpulan perbandingan yang sangat besar.

Sumber: opennet.ru

Tambah komentar