Новинка: 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 не нужно. А что же структурного в новом операторе? В том, что выбирать не обязательно нужно из литералов. Структурным шаблоном может является список, класс или даже композиция различных структур, например, с помощью ИЛИ. Рассмотрим некоторые из них.

Код курса
DPREP
Ближайшая дата курса
по запросу
Продолжительность
ак.часов
Стоимость обучения
0 руб.

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

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

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) в Москве:

Добавить комментарий