Гвіда ван Рассум прапанаваў уключыць у Python аператары для супастаўлення з узорам.

Гвіда ван Рассум (Guido van Rossum) прадставіў на разгляд супольнасцю чарнавік спецыфікацыі для рэалізацыі ў мове Python аператараў для супастаўлення з узорам (match і case). Варта адзначыць, што прапановы па даданні аператараў супастаўлення з узорам ужо публікаваліся ў 2001 і 2006 гадах (pep-0275, pep-3103), але былі адпрэчаны на карысць аптымізацыі канструкцыі «if … elif … else» для складання ланцужкоў супастаўлення.

Новая рэалізацыя шмат у чым нагадвае аператар "match", які прадстаўляецца ў мовах Scala, Rust і F#, які выконвае параўнанне выніку выканання паказанага выразы са спісам узораў, пералічаных у блоках на аснове аператара "case". У адрозненне ад аператара "switch", даступнага ў мовах Сі, Java і JavaScript, выразы на аснове "match" прапануюць значна больш шырокую функцыянальнасць. Адзначаецца, што прапанаваныя аператары дазволяць палепшыць чытальнасць кода, спросцяць супастаўленне адвольных Python-аб'ектаў і адладку, а таксама падвысяць надзейнасць кода дзякуючы магчымасці пашыранай. статычнай праверкі тыпаў.

def http_error(status):
match status:
case 400:
return "Bad request"
case 401|403|404:
return "Не магчыма"
case 418:
return "I'm a teapot"
case _:
return «Something else»

Напрыклад, магчымая распакаванне аб'ектаў, картэжаў, спісаў і адвольных паслядоўнасцяў для прывязкі зменных на аснове наяўных значэнняў. Дапускаецца вызначэнне ўкладзеных шаблонаў, выкарыстанне ў шаблоне дадатковых умоў «if», ужыванне масак («[x, y, *rest]»), мапінга звязкаў ключ/значэнне (напрыклад, {«bandwidth»: b, «latency»: l} для вымання значэнняў «bandwidth» і «latency» і слоўніка), вымання падшаблонаў (аператар «:=»), выкарыстанні найменных канстант у шаблоне. У класах магчымая настройка паводзін пры супастаўленні пры дапамозе метаду "__match__()".

ад dataclasses import dataclass

@dataclass
class Point:
x: int
y: int

def whereis(point):
match point:
case Point(0, 0):
print("Origin")
case Point(0, y):
print(f»Y={y}»)
case Point(x, 0):
print(f»X={x}»)
case Point():
print("Somewhere else")
case _:
print("Not a point")

match point:
case Point(x, y) if x == y:
print(f»Y=X at {x}»)
case Point(x, y):
print(f"Not on the diagonal")

RED, GREEN, BLUE = 0, 1, 2
match color:
case .RED:
print("I see red!")
case .GREEN:
print("Grass is green")
case .BLU
E:
print(«I'm feeling the blues :(«)

Для рэцэнзавання падрыхтаваны набор патчаў з эксперыментальнай рэалізацыяй прапанаванай спецыфікацыі, але канчатковы варыянт яшчэ абмяркоўваецца. напрыклад, прапануецца замест выраза «case _:» для значэння па змаўчанні выкарыстоўваць ключавое слова «else:» ці «default:», бо «_» у іншых кантэкстах ужываецца як часавая зменная. Таксама выклікаюць пытанні ўнутраная арганізацыя, заснаваная на трансляцыі новых выразаў у байткод, аналагічны выкарыстоўванаму для канструкцый "if...elif...else", што не забяспечыць жаданай прадукцыйнасці пры апрацоўцы вельмі вялікіх набораў супастаўленняў.

Крыніца: opennet.ru

Дадаць каментар