Гвідо ван Россум запропонував включити в 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 «Not allowed»
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
бал класу:
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

Додати коментар або відгук