Guido van Rossum предложи добавяне на оператори за съвпадение на шаблони към Python

Гуидо ван Росум подадено чернова за преглед от общността специализация за прилагане на оператори за съпоставяне на шаблони (съвпадение и регистър) в Python. Трябва да се отбележи, че предложенията за добавяне на оператори за съвпадение на шаблони вече са публикувани през 2001 г. и 2006 г. (pep-0275, pep-3103), но бяха отхвърлени в полза на оптимизирането на конструкцията „if ... elif ... else“ за компилиране на съвпадащи вериги.

Новата реализация е много подобна на оператора „съвпадение“, предоставен в Scala, Rust и F#, който сравнява резултата от определен израз със списък от модели, изброени в блокове, базирани на оператора „case“. За разлика от оператора "switch", наличен в C, Java и JavaScript, базираните на "match" изрази предлагат много повече широка функционалност. Отбелязва се, че предложените оператори ще подобрят четливостта на кода, ще опростят сравнението на произволни обекти на Python и отстраняването на грешки, а също така ще повишат надеждността на кода благодарение на възможността за разширено статична проверка на типа.

def http_error(статус):
състояние на съответствието:
случай 400:
върне "Грешна заявка"
случай 401|403|404:
върнете „Не е позволено“
случай 418:
връщане "Аз съм чайник"
case_:
върнете "Нещо друго"

Например, можете да разопаковате обекти, кортежи, списъци и произволни последователности, за да обвържете променливи въз основа на съществуващи стойности. Разрешено е да се дефинират вложени шаблони, да се използват допълнителни условия „if“ в шаблона, да се използват маски („[x, y, *rest]“), съпоставяне на ключ/стойност (например {„bandwidth“: b, „latency“ ”: l} за извличане на стойности и речник на „честотна лента“ и „закъснение“, извличане на подшаблони (оператор „:="), използване на именувани константи в шаблона. В класовете е възможно да персонализирате поведението на съвпадение с помощта на метода „__match__()“.

от класове данни импортиране на клас данни

@dataclass
клас точка:
x: int
y: int

def whereis(точка):
мач точка:
case Point(0, 0):
печат ("Произход")
case Point(0, y):
print(f"Y={y}")
case Point(x, 0):
печат (f"X={x}")
case Point():
print("Някъде другаде")
case_:
print("Не е точка")

мач точка:
case Point(x, y), ако x == y:
print(f"Y=X при {x}")
case Point(x, y):
print(f"Не по диагонала")

ЧЕРВЕНО, ЗЕЛЕНО, СИНЬО = 0, 1, 2
съответстващ цвят:
случай .RED:
print("Виждам червено!")
случай .ЗЕЛЕНО:
print("Тревата е зелена")
случай .BLU
E:
print(“Усещам блуса :(“)

Подготвен е комплект за преглед лепенки с експериментални изпълнение предложена спецификация, но окончателната версия е все още обсъдени, Например предлагани Вместо израза "case _:" за стойност по подразбиране, използвайте ключовата дума "else:" или "default:", тъй като "_" в други контексти се използва като временна променлива. Също така под въпрос е вътрешната организация, която се основава на превеждане на нови изрази в байт код, подобен на този, използван за конструкции „if ... elif ... else“, което няма да осигури желаната производителност при обработка на много големи набори от сравнения.

Източник: opennet.ru

Добавяне на нов коментар