Guido van Rossum zaproponował dodanie do Pythona operatorów dopasowywania wzorców

Guido van Rossuma wprowadzono projekt do wglądu społeczności specyfikacje do implementowania operatorów dopasowywania wzorców (dopasowanie i wielkość liter) w Pythonie. Należy zauważyć, że propozycje dodania operatorów dopasowywania wzorców zostały już opublikowane w latach 2001 i 2006 (pep-0275, pep-3103), ale zostały odrzucone na rzecz optymalizacji konstrukcji „if… elif… else” do kompilacji pasujących łańcuchów.

Nowa implementacja przypomina operator „dopasuj” dostępny w językach Scala, Rust i F#, który porównuje wynik określonego wyrażenia z listą wzorców wymienionych w blokach na podstawie operatora „case”. W przeciwieństwie do operatora „switch” dostępnego w językach C, Java i JavaScript, wyrażenia oparte na „dopasowaniu” oferują znacznie więcej szeroka funkcjonalność. Należy zauważyć, że proponowane operatory poprawią czytelność kodu, uproszczą porównywanie dowolnych obiektów Pythona i debugowanie, a także zwiększą niezawodność kodu dzięki możliwości rozszerzenia statyczne sprawdzanie typu.

def http_error(status):
stan meczu:
przypadek 400:
zwróć „Złe żądanie”
sprawa 401|403|404:
zwróć „Niedozwolone”
przypadek 418:
powrót „Jestem czajnikiem”
sprawa_:
zwróć „Coś innego”

Można na przykład rozpakowywać obiekty, krotki, listy i dowolne sekwencje, aby powiązać zmienne w oparciu o istniejące wartości. Dopuszczalne jest definiowanie szablonów zagnieżdżonych, stosowanie w szablonie dodatkowych warunków „if”, stosowanie masek („[x, y, *rest]”), mapowań klucz/wartość (np. {„bandwidth”: b, „latency ”: l}, aby wyodrębnić wartości „przepustowości” i „opóźnienia” oraz słownik), wyodrębnić podszablony (operator:="), użyć nazwanych stałych w szablonie. Na zajęciach można dostosować zachowanie dopasowywania za pomocą metody „__match__()”.

z klas danych importuj klasę danych

@klasa danych
Punkt klasy:
x:int
y:wew

określ gdzie się znajduje(punkt):
punkt meczowy:
przypadek Punkt (0, 0):
print("Pochodzenie")
punkt przypadku (0, y):
print(f"Y={y}")
punkt przypadku (x, 0):
drukuj(f"X={x}")
Punkt przypadku():
print("Gdzie indziej")
sprawa_:
print("Nie ma sensu")

punkt meczowy:
przypadek Punkt(x, y) jeśli x == y:
print(f"Y=X w {x}")
punkt przypadku (x, y):
print(f"Nie po przekątnej")

CZERWONY, ZIELONY, NIEBIESKI = 0, 1, 2
Dopasuj kolor:
sprawa .CZERWONY:
print("Widzę kolor czerwony!")
obudowa .ZIELONA:
print("Trawa jest zielona")
obudowa .BLU
E:
print(“Czuję smutek :(“)

Zestaw został przygotowany do recenzji łaty z eksperymentalnym realizacja proponowaną specyfikację, ale ostateczna wersja jest nadal omówione. Na przykład oferowany Zamiast wyrażenia „case _:” jako wartości domyślnej użyj słowa kluczowego „else:” lub „default:”, ponieważ „_” w innych kontekstach jest używane jako zmienna tymczasowa. Wątpliwa jest także organizacja wewnętrzna, która opiera się na tłumaczeniu nowych wyrażeń na kod bajtowy podobny do tego używanego w konstrukcjach „if… elif… else”, co nie zapewni pożądanej wydajności przy przetwarzaniu bardzo dużych zestawów porównań.

Źródło: opennet.ru

Dodaj komentarz