10 189 subscribers

Новинка Python 3.10: оператор переключения Structural pattern matching

152 full reads
Новинка Python 3.10: оператор переключения Structural pattern matching

Источник: Nuances of Programming

Оператор switch похож на оператор if в языках программирования вроде Pascal, Ada, C, C++, C#, Visual Basic .NET и Java. По ключевым словам вроде switch, case, select и inspect данный оператор уже давно доступен почти во всех высокоуровневых императивных языках программирования, а также поддерживается другими типами языков.

Больше, чем обычный оператор switch!

Нововведение свежей версии Python 3.10 можно назвать одним из самых больших со времен версии 3.0. Еще бы, ведь наконец-то, спустя годы ожесточенных споров, в Python реализована действительно новая возможность под названием Structural pattern matching, структурное сопоставление с образцом. В других языках, таких как JavaScript, она уже давно известна как switch case statement. Удивительно, но до сих пор в Python не существовало аналога switch case, следовательно, уникальное обновление поможет вам облегчить путь программиста.

Такая радикальная позиция относительно неодобрения switch case statement приписывается Гвидо ван Россуму, автору языка программирования Python, который в 2018-м году покинул пост «великодушного пожизненного диктатора» (BDFL) в Python Software Foundation.

Рассмотрим подробнее, как работают новые операторы match и case в свежем обновлении Python до версии 3.10.

Во всех предшествовавших версиях Python ветвление алгоритма через сопоставление данных с образцом реализовывалось благодаря оператору дополнительного условия elif, как в нижеизложенном примере:

def http_error(status):
if status == 400:
return “Bad request”
elif status == 404:
return “Not found”
elif status == 418:
return “I am teapot, can't brew coffee!”

С доступом к новой возможности сопоставления шаблонов pattern matching вы сможете написать следующее:

def http_error(status):
match status:
case 400:
return “Bad request”
case 404:
return “Not found”
case 418:
return “I am teapot, can't brew coffee!”
case _:
return “We have to a little further”

Последняя переменная с одним нижним подчеркиванием в идентификаторе  —  это значение по умолчанию, знак подстановки для случая, когда значение не совпадало ни с одним из образцов за всю проверку. Словно аналог оператора else в обычном условии.

Если в коде применяется цепочка из строковых значений, проверка на совпадение с ними реализовывается, как показано ниже:

def programming_laguage(abbr_name):
match abbr_name:
case "Py":
return "Python"
case "Go":
return "Golang"
case "js" | "jsx" | "jquery":
return "Javascript"
case _:
return "No Language Defined"

Рассмотрев два вышеизложенных примера легко удивиться, стоило ли того нововведение, своим синтаксическим сахаром противоречащее принципам PEP 20 или Дзену Python. Конечно, если бы новый функционал ограничивался небольшим изменением привычного оператора дополнительного условия elif, то его не добавляли бы в обновлении. В действительности, нововведению по силам много чего еще  —  давайте рассмотрим более сложный пример.

С помощью другого аспекта структурного сопоставления шаблонов вы сможете сравнивать значение со списками и последовательностями. Проанализируйте приведенный ниже пример:

match grade:
case [1, 2]:
print('Grade A')
case [1, 2, 3]:
print('Grade B')

Примечательно, что с помощью _wildcard сопоставление шаблонов выводится на новый уровень, как в примере:

match grade:
case [1, 2]:
print('Grade A')
case [1, 2, 3]:
print('Grade B')
case [1, 2, _]:
print('Grade C')
case _:
print('Default option')

Скорее всего, вы подумали, что было бы удобно написать переключатель-кортеж. Вы правы, подобное действительно очень удобно  —  ниже приведен хороший пример сценария с кортежами.

Задача. Представьте декартову систему координат, обозначаемую (x, y), где начало координат  —  это точка (0,0), а отображаемые на площади функции  —  это f’X={x} и f” Y={y} для x и y соответственно.

# coordinate ссылается на координату (x, y)

match coordinate:
case (0, 0):
print("Hey this is Origin")
case (0, y):
print(f"Y={y}")
case (x, 0):
print(f"X={x}")
case (x, y):
print(f"X={x}, Y={y}")
case _:
raise ValueError("Not a point")

Выводы

Обновление в целом, а оператор switch case  —  в частности, привносят в язык программирования Python дополнительную гибкость и открывают удивительные возможности, определяющие организацию ваших проектов в будущем.

Честно говоря, в Python switch case помогает писать более чистый и читабельный код, не стесняйтесь попробовать, как только обновите интерпретатор. Спасибо за чтение!

Читайте также:

Читайте нас в Telegram, VK

Перевод статьи Demola Adebowale: How the new switch statement of python 3.10 works