В октябре был опубликован релиз 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) в Москве: