Утверждено добавление в 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» для составления цепочек сопоставления. На этот раз также не обошлось без разделения мнений и для конечного принятия решения в качестве арбитра был привлечён руководящий совет, который сумел придти к консенсусу.

Источник: http://www.opennet.ru/opennews/art.shtml? num=54563

©  OpenNet