Guido van Rossum topluluk incelemesi için taslak Python'da kalıp eşleştirme operatörlerini (eşleşme ve durum) uygulamak için. Desen eşleştirme operatörlerinin eklenmesine yönelik tekliflerin 2001 ve 2006'da zaten yayınlanmış olduğuna dikkat edilmelidir (, ), ancak eşleşen zincirleri derlemek için "if ... elif ... else" yapısının optimize edilmesi lehine reddedildi.
Yeni uygulama, Scala, Rust ve F#'da sağlanan ve belirtilen bir ifadenin sonucunu "case" operatörüne dayalı olarak bloklar halinde listelenen kalıpların listesiyle karşılaştıran "eşleştirme" operatörüne çok benzer. C, Java ve JavaScript'te bulunan "switch" operatörünün aksine, "match" tabanlı ifadeler çok daha fazlasını sunar . Önerilen operatörlerin kodun okunabilirliğini artıracağı, rastgele Python nesnelerinin karşılaştırılmasını ve hata ayıklamayı basitleştireceği ve ayrıca genişletilmiş genişletme olasılığı nedeniyle kodun güvenilirliğini artıracağı belirtiliyor. .
def http_error(durum):
maç durumu:
durumda 400:
"Kötü istek" döndür
durum 401|403|404:
"İzin verilmiyor" ifadesini döndür
durumda 418:
"Ben bir çaydanlığım" ifadesini döndür
dava _:
"Başka bir şey" ifadesini döndür
Örneğin, değişkenleri mevcut değerlere göre bağlamak için nesneleri, kayıtları, listeleri ve rastgele dizileri açabilirsiniz. İç içe geçmiş şablonların tanımlanmasına, şablonda ek "if" koşullarının kullanılmasına, maskelerin ("[x, y, *rest]") kullanılmasına, anahtar/değer eşlemelerinin (örneğin, {"bant genişliği": b, "gecikme) kullanılmasına izin verilir. ”: l} "bant genişliği" ve "gecikme" değerlerini ve sözlüğünü çıkarmak için, alt şablonları çıkarın (":=" operatörü), şablonda adlandırılmış sabitleri kullanın. Sınıflarda “__match__()” yöntemini kullanarak eşleştirme davranışını özelleştirmek mümkündür.
veri sınıflarından veri sınıfını içe aktar
@veri sınıfı
sınıf Noktası:
x:int
y:int
def burada(nokta):
maç puanı:
durum Noktası(0, 0):
print("Köken")
durum Noktası(0, y):
print(f"Y={y}")
durum Nokta(x, 0):
print(f"X={x}")
vaka Noktası():
print("Başka bir yerde")
dava _:
print("Bir nokta değil")
maç puanı:
case Nokta(x, y) eğer x == y:
print(f"Y=X, {x}")
durum Nokta(x, y):
print(f"Köşegende değil")
KIRMIZI, YEŞİL, MAVİ = 0, 1, 2
renk eşleme:
durum.KIRMIZI:
print("Kırmızı görüyorum!")
durumda. YEŞİL:
print("Çim yeşildir")
durumda.BLU
E:
print(“Üzülüyorum :(“)
İnceleme için bir set hazırlandı deneysel ile önerilen spesifikasyon, ancak son versiyon hala . Örneğin, Varsayılan değer için "case _:" ifadesi yerine "else:" veya "default:" anahtar kelimesini kullanın, çünkü diğer bağlamlarda "_" geçici bir değişken olarak kullanılır. Ayrıca, yeni ifadelerin "if ... elif ... else" yapılarında kullanılana benzer bayt koduna çevrilmesine dayanan ve çok büyük karşılaştırma kümelerini işlerken istenen performansı sağlamayacak olan dahili organizasyon da sorgulanabilir.
Kaynak: opennet.ru
