Python може да получи синтаксис на съвпадение на шаблони

Създателите на езика Python обмислят ново предложение, PEP 622, което най-накрая ще доведе до синтаксис на съответстващ шаблон на Python. Новите изявления за съвпадение на шаблони биха дали на програмистите на Python по-изразителни начини за обработка на структурирани данни, без да се налага да прибягват до заобикаляне. 

Съпоставянето на образци е често срещана характеристика на много програмни езици, като например switch/caseC. Това позволява да се предприемат едно от редица възможни действия въз основа на стойността на дадена променлива или израз. Докато на Python липсва естествен синтаксис за съвпадение на образци, е възможно да се емулира с  if/elif/elseвериги или търсене в речник.

PEP 622 предлага метод за съпоставяне на израз с редица видове модели, използвайки match/caseсинтаксис:

съвпадат с нещо: случай 0 | 1 | 2: калъф за печат ("Малък брой") [] | [_]: print ("Кратка последователност") case str () | bytes (): print ("Нещо като низ") case _: print ("Нещо друго")

Поддържаните типове съвпадения на шаблони включват литерали, имена, константи, последователности, съпоставяне (основно присъствието на двойка ключ-стойност в израза), клас, смес от горното или някой от тези плюс условни изрази. Всяко съвпадение, което е двусмислено или невъзможно за разрешаване, ще доведе до изключение по време на изпълнение.

Обектите могат да се справят с тестове за съвпадение чрез нов протокол, наречен __match__протокол. Ако обект реализира __match__метода, той може да се използва за тестване дали съответства на даден модел на клас и връщане на подходящ отговор.

PEP 622 също така ще позволи проверки на статичен тип да проверят дали съвпаденията могат да бъдат проверени. Нов @sealedдекоратор за клас показва на типовите проверки, че всеки подклас на въпросния клас е дефиниран в същия модул като базовия клас.

Предишните PEP за добавяне на съвпадение на образци - PEP 275 и PEP 3103, предложени съответно през 2001 и 2006 г., бяха отхвърлени поради липса на подкрепа от страна на хората. PEP 3103 е изготвен от създателя на Python Guido van Rossum. Новият PEP, автор на ван Росум и няколко други, има за цел да осигури регулярни изрази за съвпадение на обекти, а не просто обикновен if/elif/else заместител. Авторите отбелязват, че много аспекти на този PEP са вдъхновени от това как съвпадението на шаблоните работи в Rust и Scala. 

Все още ще бъде обсъдено как всичко това ще бъде приложено под капака. Изпълнението, предложено в PEP 622, би генерирало същите последователности на байт кодове като if/elif/elseверига. По-големите switch/caseблокове могат да станат по-малко ефективни в зависимост от това колко условна логика е включена във всеки case. Но PEP ясно посочва, че все още са на разположение неограничен брой подходи и оптимизации на производителността (напр. Запомняне).

Дори ако PEP в крайна сметка бъде приет, голяма част от него може да се промени. Един от въпросите, който е вероятно да бъде оспорен, е използването на case _: вместо else: като окончателна клауза за всички  switch изявления. _ се използва като временна променлива в много контексти и отменянето на нейното поведение едностранно може да бъде отстъпка за разработчиците.