Guido van Rossum Python-a nümunə uyğunlaşdıran operatorların əlavə edilməsini təklif etdi

Guido van Rossum təqdim etdi icmanın nəzərdən keçirilməsi üçün layihə spesifikasiyalar Python-da model uyğunlaşdırma operatorlarının (mat və halda) həyata keçirilməsi üçün. Qeyd etmək lazımdır ki, naxış uyğunluğu operatorlarının əlavə edilməsi təklifləri artıq 2001 və 2006-cı illərdə dərc edilmişdir (pep-0275, pep-3103), lakin uyğun zəncirlərin tərtib edilməsi üçün “if ... elif ... else” konstruksiyasının optimallaşdırılması lehinə rədd edildi.

Yeni tətbiq Scala, Rust və F#-da təqdim olunan "uyğunluq" operatoruna çox bənzəyir ki, bu da müəyyən edilmiş ifadənin nəticəsini "case" operatoru əsasında bloklarda sadalanan nümunələrin siyahısı ilə müqayisə edir. C, Java və JavaScript-də mövcud olan "keçid" operatorundan fərqli olaraq, "uyğunluq" əsaslı ifadələr daha çox şey təklif edir. geniş funksionallıq. Qeyd edilir ki, təklif olunan operatorlar kodun oxunaqlılığını təkmilləşdirəcək, ixtiyari Python obyektlərinin müqayisəsini və sazlamanı sadələşdirəcək, həmçinin genişləndirmə imkanları hesabına kodun etibarlılığını artıracaq. statik növün yoxlanılması.

def http_error(status):
uyğunluq vəziyyəti:
iş 400:
"Səhv sorğu"nu qaytarın
hal 401|403|404:
"İcazə verilmir" qaytarın
iş 418:
"Mən çaydanam" sözünə qayıt
hal_:
"Başqa bir şey" qaytarın

Məsələn, mövcud dəyərlərə əsaslanan dəyişənləri bağlamaq üçün obyektləri, dəstləri, siyahıları və ixtiyari ardıcıllıqları paketdən çıxara bilərsiniz. İç-içə şablonları müəyyən etməyə, şablonda əlavə “if” şərtlərindən istifadə etməyə, maskalardan (“[x, y, *rest]”), açar/dəyər xəritələrindən istifadə etməyə (məsələn, {“bandwidth”: b, “latency”) icazə verilir. ”: l} "bant genişliyi" və "gecikmə" dəyərlərini və lüğəti çıxarmaq üçün, alt şablonları çıxarın (":=" operatoru), şablonda adlandırılmış sabitlərdən istifadə edin. Dərslərdə “__match__()” metodundan istifadə edərək uyğun davranışı fərdiləşdirmək mümkündür.

dataclass import dataclass

@dataclass
sinif nöqtəsi:
x:int
y:int

def whereis(nöqtə):
uyğunluluq nöqtəsi:
Case Point(0, 0):
çap ("Mənşə")
Case Point(0, y):
çap(f"Y={y}")
Case Point(x, 0):
çap (f"X={x}")
case Point():
çap ("Başqa yerdə")
hal_:
çap ("Bir nöqtə deyil")

uyğunluluq nöqtəsi:
halda Nöqtə(x, y) əgər x == y:
çap (f"Y=X {x}")
Case Point(x, y):
çap(f"Diaqonalda deyil")

QIRMIZI, YAŞIL, MAVİ = 0, 1, 2
uyğun rəng:
halda .RED:
çap ("Qırmızı görürəm!")
halda .YAŞIL:
çap ("Ot yaşıldır")
halda .BLU
E:
çap ("Mən blues hiss edirəm :(")

Baxış üçün dəst hazırlanmışdır yamaqlar eksperimental ilə həyata keçirilməsi Təklif olunan spesifikasiya, lakin son versiya hələ də qalır müzakirə edildi. Məsələn, təklif etdi Defolt dəyər üçün "case _:" ifadəsi əvəzinə "else:" və ya "default:" açar sözünü istifadə edin, çünki digər kontekstlərdə "_" müvəqqəti dəyişən kimi istifadə olunur. Həmçinin çox böyük müqayisə dəstlərini emal edərkən istənilən performansı təmin etməyəcək "if ... elif ... else" konstruksiyaları üçün istifadə edilənə bənzər yeni ifadələrin baytkoda çevrilməsinə əsaslanan daxili təşkilat da şübhəlidir.

Mənbə: opennet.ru

Добавить комментарий