Guido van Rossum Python-ga naqsh moslashtiruvchi operatorlarni qo'shishni taklif qildi

Gido van Rossum tanishtirdi hamjamiyat ko'rib chiqish uchun loyiha texnik xususiyatlar Python-da naqsh moslashtiruvchi operatorlarni (mos va katta-katta) amalga oshirish uchun. Shuni ta'kidlash kerakki, naqshga mos keladigan operatorlarni qo'shish bo'yicha takliflar allaqachon 2001 va 2006 yillarda nashr etilgan (pep-0275, pep-3103), lekin mos keladigan zanjirlarni kompilyatsiya qilish uchun "agar ... elif ... else" konstruktsiyasini optimallashtirish foydasiga rad etildi.

Yangi tatbiq Scala, Rust va F# da taqdim etilgan "match" operatoriga o'xshaydi, bu ko'rsatilgan ifoda natijasini "case" operatoriga asoslangan bloklarda keltirilgan naqshlar ro'yxati bilan solishtiradi. C, Java va JavaScript-da mavjud bo'lgan "switch" operatoridan farqli o'laroq, "mos" ga asoslangan ifodalar ko'proq narsani taklif qiladi. keng funksionallik. Ta'kidlanishicha, taklif etilayotgan operatorlar kodni o'qish qobiliyatini yaxshilaydi, ixtiyoriy Python ob'yektlarini taqqoslashni va disk raskadrovkani soddalashtiradi, shuningdek kengaytirilgan imkoniyatlar tufayli kod ishonchliligini oshiradi. statik turini tekshirish.

def http_error(status):
o'yin holati:
ish 400:
"Yomon so'rov" ni qaytarish
holat 401|403|404:
"Ruxsat berilmagan" ni qaytarish
ish 418:
Qaytish "Men choynakman"
case_:
"Boshqa narsani" qaytaring

Masalan, mavjud qiymatlar asosida o'zgaruvchilarni bog'lash uchun ob'ektlar, kortejlar, ro'yxatlar va ixtiyoriy ketma-ketliklarni ochishingiz mumkin. Ichki qoʻyilgan shablonlarni aniqlash, shablonda qoʻshimcha “agar” shartlaridan foydalanish, maskalardan (“[x, y, *rest]”), kalitlar/qiymatlarni koʻrsatishdan (masalan, {“tarmoq kengligi”: b, “kechikish”) foydalanishga ruxsat beriladi. ”: l} “o‘tkazish qobiliyati” va “kechikish” qiymatlari va lug‘atni chiqarish uchun, pastki shablonlarni (“:=” operatori) ajratib oling, shablonda nomlangan konstantalardan foydalaning. Sinflarda "__match__()" usuli yordamida mos keladigan xatti-harakatlarni sozlash mumkin.

ma'lumotlar sinflaridan ma'lumotlar sinfini import qilish

@ma'lumotlar sinfi
sinf nuqtasi:
x: int
y:int

def whereis(nuqta):
mos nuqtasi:
Case Point(0, 0):
chop ("kelib chiqishi")
Case Point(0, y):
chop etish (f"Y={y}")
Case Point(x, 0):
chop etish (f"X={x}")
case Point():
chop etish ("Boshqa joyda")
case_:
chop etish ("Bir nuqta emas")

mos nuqtasi:
case Point(x, y) agar x == y bo'lsa:
chop etish (f"Y=X da {x}")
Case Point(x, y):
chop etish (f"Diagonalda emas")

QIZIL, YASHIL, KO‘K = 0, 1, 2
mos rang:
Case .RED:
chop etish ("Men qizilni ko'raman!")
Case .GREEN:
chop etish ("O't yashil")
Case .BLU
E:
print("Men ko'k rangni his qilyapman :(")

Ko'rib chiqish uchun to'plam tayyorlandi yamalar eksperimental bilan amalga oshirish taklif qilingan spetsifikatsiya, ammo yakuniy versiya hali ham muhokama qilindi. Masalan, taklif qildi Standart qiymat uchun "case _:" iborasi o'rniga "else:" yoki "default:" kalit so'zidan foydalaning, chunki boshqa kontekstlarda "_" vaqtinchalik o'zgaruvchi sifatida ishlatiladi. Yangi iboralarni "if ... elif ... else" konstruktsiyalari uchun ishlatiladiganga o'xshash bayt-kodga tarjima qilishga asoslangan ichki tashkilot ham shubhali, bu juda katta taqqoslashlar to'plamini qayta ishlashda kerakli ishlashni ta'minlamaydi.

Manba: opennet.ru

a Izoh qo'shish