Guido van Rossum mencadangkan menambah operator padanan corak pada Python

Guido van Rossum diperkenalkan draf untuk semakan komuniti spesifikasi untuk melaksanakan pengendali padanan corak (padanan dan kes) dalam Python. Perlu diingatkan bahawa cadangan untuk menambah pengendali padanan corak telah pun diterbitkan pada tahun 2001 dan 2006 (semangat-0275, semangat-3103), tetapi ditolak memihak kepada mengoptimumkan binaan "if ... elif ... else" untuk menyusun rantaian padanan.

Pelaksanaan baharu adalah sama seperti pengendali "padanan" yang disediakan dalam Scala, Rust, dan F#, yang membandingkan hasil ungkapan tertentu dengan senarai corak yang disenaraikan dalam blok berdasarkan operator "kes". Tidak seperti pengendali "suis" yang tersedia dalam C, Java dan JavaScript, ungkapan berasaskan "padanan" menawarkan lebih banyak lagi fungsi yang luas. Adalah diperhatikan bahawa pengendali yang dicadangkan akan meningkatkan kebolehbacaan kod, memudahkan perbandingan objek Python dan penyahpepijatan sewenang-wenangnya, dan juga meningkatkan kebolehpercayaan kod terima kasih kepada kemungkinan dilanjutkan pemeriksaan jenis statik.

def http_error(status):
status perlawanan:
kes 400:
kembalikan "Permintaan buruk"
kes 401|403|404:
kembali "Tidak dibenarkan"
kes 418:
kembali "Saya teko"
kes_:
kembalikan "Sesuatu yang lain"

Contohnya, anda boleh membongkar objek, tupel, senarai dan jujukan arbitrari untuk mengikat pembolehubah berdasarkan nilai sedia ada. Ia dibenarkan untuk menentukan templat bersarang, menggunakan syarat “jika” tambahan dalam templat, menggunakan topeng (“[x, y, *rehat]”), pemetaan kunci/nilai (contohnya, {“lebar jalur”: b, “latensi ”: l} untuk mengekstrak nilai dan kamus "lebar jalur" dan "kependaman", ekstrak subtemplat (":=" operator), gunakan pemalar bernama dalam templat. Dalam kelas, adalah mungkin untuk menyesuaikan tingkah laku padanan menggunakan kaedah "__match__()".

daripada kelas data import kelas data

@dataclass
Mata kelas:
x:int
y:int

def whereis(point):
mata perlawanan:
Titik kes(0, 0):
print("Asal")
Titik kes(0, y):
cetak(f"Y={y}")
Titik kes(x, 0):
cetak(f"X={x}")
Titik kes():
print("Di tempat lain")
kes_:
print("Bukan titik")

mata perlawanan:
kes Titik(x, y) jika x == y:
cetak(f"Y=X pada {x}")
Titik kes(x, y):
print(f"Bukan pada pepenjuru")

MERAH, HIJAU, BIRU = 0, 1, 2
warna padan:
kes .MERAH:
print("Saya nampak merah!")
kes .HIJAU:
print("Rumput hijau")
kes .BLU
E:
print(“Saya rasa biru :(“)

Satu set telah disediakan untuk semakan tompok dengan eksperimen pelaksanaan spesifikasi yang dicadangkan, tetapi versi terakhir masih dibincangkan. Contohnya ditawarkan Daripada ungkapan "case _:" untuk nilai lalai, gunakan kata kunci "else:" atau "default:", kerana "_" dalam konteks lain digunakan sebagai pembolehubah sementara. Juga boleh dipersoalkan ialah organisasi dalaman, yang berdasarkan menterjemah ungkapan baharu kepada kod bait yang serupa dengan yang digunakan untuk binaan "if ... elif ... else", yang tidak akan memberikan prestasi yang diingini apabila memproses set perbandingan yang sangat besar.

Sumber: opennet.ru

Tambah komen