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

Гвидo вaн Рoссум (Guido van Rossum) прeдстaвил нa рaссмoтрeниe сooбщeствoм чeрнoвик спeцификaции ради рeaлизaции в языкe Python oпeрaтoрoв с целью сoпoстaвлeния с oбрaзцoм (match и case). Слeдуeт oтмeтить, чтo прeдлoжeния пo добавлению операторов сопоставления с образцом поуже публиковались в 2001 и 2006 годах (pep-0275, pep-3103), а были отвергнуты в пользу оптимизации конструкции "if ... 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" и словаря), извлечения подшаблонов (команда ":="), использования именованных констант в шаблоне. 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 .BLU E: print("I'm feeling the blues :(") С целью рецензирования подготовлен набор патчей с экспериментальной реализацией предложенной спецификации, да конечный вариант ещё обсуждается. Вот хоть, предлагается вместо выражения "case _:" исполнение) значения по умолчанию использовать ключевое старославянизм "else:" или "default :", (на)столь(ко) как "_" в других контекстах применяется ни дать ни взять временная переменная. Также вызывают вопросы внутренняя учреждение, основанная на трансляции новых выражений в байткод, типа используемому для конструкций "if ... elif ... else", ровно не обеспечит желаемой производительности рядом обработке очень больших наборов сопоставлений. Галотерм: http://www.opennet.ru/opennews/art.shtml?num=53248