Новинка: Python 3.10 и оператор выбора, которого так ждали

автор рубрика
Новинка: Python 3.10 и оператор выбора, которого так ждали

В октябре был опубликован релиз Python 3.10. Много нового в нем появилось, но самым заметным новшеством стало появление оператора выбора (match-case). Сегодня рассмотрим новинку, как оператор выбор используется, а также обсудим его неоднозначность.

Что за оператор выбора

Сопоставление по структурному шаблону (Structural Pattern Matching) — это аналог оператора выбора в других языках, например, switch в Си. Тем не менее, согласно PEP635, его стоит считать скорее “обобщенным методом распаковки итерируемых объектов” (generalized concept of iterable unpacking).

До версии 3.10 приходилось использовать оператор if ... elif. В версии Python 3.10 появился оператор match case, который имеет больше особенностей, чем простой оператор выбора. Синтаксис его следующий:

def foo(key):
    match key:
        case 'python':
            # do something with py
        case 'c++':
            # do something with cpp
        case _:
            # default

В отличие от Си-подобных языков, каждый case уже подразумевает break в конце, поэтому ставить break не нужно. А что же структурного в новом операторе? В том, что выбирать не обязательно нужно из литералов. Структурным шаблоном может является список, класс или даже композиция различных структур, например, с помощью ИЛИ. Рассмотрим некоторые из них.

Подготовка данных для Data Mining на Python

Код курса
DPREP
Ближайшая дата курса
21 марта, 2022
Длительность обучения
32 ак.часов
Стоимость обучения
48 000 руб.

Структурные шаблоны

Например, нужно проверить является ли анализируемый объект последовательностью (списком или множеством):

case ['a', 'b']:
    pass

А что если мы не знаем длину входящего списка, а известны лишь первые два элемента. Новый оператор позволяет выделить остальные элемента последовательности в переменной. Это как раз то, что называется распаковкой (unpacking), о которой мы говорили в одной из статей. Мы можем не выделять распакованное значение в переменную (если оно не нужно), а оставить в виде шаблона подстановки (_). Выглядит в Python 3.10 распаковка с применением нового оператора match-case так:

match seq:
    case [2, 4, *rest]: # первые да элемента известны
        print("Yes", *rest)
    case _:
        print("No")

Если всё же длина последовательности известна, при этом какие-то элементы могут меняться, то их также можно задать перемененными:

match seq:
    case (1, two, three, 4):
        print("Yes", two, three)

Ещё одна неожиданная особенность структурных шаблонов, что можно проводить проверку их значений. Например, так:

case (y, x) if x == y:
    print("number")
case (y, *rest) if len(rest) == 3:
    print(rest)

Словари в виде структурных шаблонов

Списки и множества не единственные структуры данных, которые могут использоваться в новом операторе Python 3.10. Словари также могут служить структурными шаблонами. Теперь можно сравнивать словари по ключам:

match d:
    case {"move": direction, "distance": km}:
        move(direction, km)
    case {"stop": duration}:
        sleep(duration)

В этом примере будет сравниваться словарь d с двумя случаями. Причем сам словарь должен содержать ровно столько аргументов, сколько задано в case. Хотя опять же можно использовать распаковку, когда количество элементов неизвестно:

match d:
    case {"move": val1, **kwargs}:
        move(kwargs["direction"])

Использование ИЛИ в новом операторе

Если некоторые случаи обрабатываются схожим образом, то мы можем их объединить в виде логического выражения c помощью операции ИЛИ (|). Причем, операцию ИЛИ можно использовать и с литералами, и с последовательности, и со словарями. Ниже код на Python, где используется шаблон с ИЛИ.

match k:
    case 1 | 2:
        print("number")
    case (1, _) | (_, 2):
        print("sequence")

То, что можно делать со структурными шаблонами Python 3.10 не ограничивается вышеперечисленными примерами. Вы можете изучить официальное руководство. С другой стороны, остаются вопросы относительно данного новшества: не нарушает ли оно один из принципов Zen Python — “существует только один способ сделать это”? Более того, никто не отменял проблем с обратной совместимостью, ведь многие до сих пор работают с версией 3.6, например. Поэтому программистам, привыкшим к ранним версиям, будет непривычно читать подобный код.

 

А на наших курсах вы узнаете, как решать задачи из Data Scienc на языке Python в лицензированном учебном центре обучения и повышения квалификации руководителей и ИТ-специалистов (менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data) в Москве:

Комментировать