Утверждено добавление в Python операторов для сопоставления с образцом

Руководящий совет проекта Python утвердил добавление в язык операторов для сопоставления с образцом (match и case). Поддержка новых операторов появится в выпуске Python 3.10. Новые операторы “match” и “case” позволят улучшить читаемость кода, упростят сопоставление произвольных Python-объектов и отладку, а также повысят надёжность кода благодаря возможности расширенной статической проверки типов.

Реализация во многом напоминает оператор “match”, предоставляемый в языках Scala, Rust и F#, который выполняет сравнение результата выполнения указанного выражения со списком образцов, перечисленных в блоках на основе оператора “case”. В отличие от оператора “switch”, доступного в языках Си, Java и JavaScript, выражения на основе “match” предлагают гораздо более широкую функциональность.

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__()”.

from 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 .BLUE: print(“I’m feeling the blues :(“)

Ранее, попытки реализации операторов сопоставления с образцом предпринимались в 2001 и 2006 годах (pep-0275, pep-3103), но были отвергнуты в пользу оптимизации конструкции “if … elif … else” для составления цепочек сопоставления. На этот раз также не обошлось без разделения мнений и для конечного принятия решения в качестве арбитра был привлечён руководящий совет, который сумел придти к консенсусу.

Release. Ссылка here.