В этой статье мы рассмотрим использование новых операторов сопоставления шаблонов в Python.
Введение
Объектно-ориентированный язык программирования Python должен получить новую возможность в версии 3.10, которая в основном известна из функциональных языков: сопоставление шаблонов. Изменение вызвало споры в сообществе Python и вызвало бурные дебаты.
Сопоставление по шаблону — это метод символьной обработки, использующий шаблон для идентификации дискретных структур или подмножеств, например, строк, деревьев или графиков. Эта процедура встречается в функциональных или логических языках программирования, где выражение сравнения используется для обработки данных на основе их структуры, например, в Scala, Rust и F#. Оператор соответствия принимает выражение и сравнивает его с последовательными шаблонами, указанными в одном или нескольких случаях. Это внешне похоже на оператор switch на C, Java или JavaScript, но гораздо мощнее.
Пример работы оператора case и match
Теперь в Python 3.10 также будет реализовано выражение сравнения. Реализация описана в PEP 634. То, как должно работать функция сравнения выражений показано на этом очень простом примере, где значение сравнивается с несколькими буквами:
В последнем случае оператор сравнения сравнивает подчеркивание, где знак _ выступает в качестве плацдарма, который перехватывает все. Это вызывает раздражение у разработчиков, поскольку подчеркивание обычно используется на Python перед именами переменных, чтобы объявить их для внутреннего использования. Хотя Python не делает различий между частными и общедоступными переменными так же строго, как Java, это всё же очень широко используемая конвенция, которая также указана в Руководстве по стилям для Python Code.
Однако, предлагаемое утверждение о совпадении может не только проверять шаблоны, т.е. обнаруживать совпадение между значением переменной и заданным шаблоном, но и возвращать переменные, совпадающие с заданным шаблоном.
Это приводит к тому, что на Python мы внезапно сталкиваемся с константами Шредингера, которые остаются неизменными только до тех пор, пока мы не рассмотрим их более подробно в операторе соответствия. Следующий пример призван объяснить это:
Вывод программы:
Такое поведение приводит к резкой критике предложения со стороны опытных разработчиков Python, таких как Брэндон Роудс, автор книги «Основы сетевого программирования на Python»:
Если эта плохо продуманная функция сравнения шаблонов действительно добавлена в Python, мы теряем принцип, которому я всегда учил студентов: «если вы видите незадокументированную константу, вы всегда можете назвать ее, не меняя значения кода». Принцип подстановки, выученный на алгебре? Он больше не будет применяться.
Однако многие давние разработчики Python не только ворчат по поводу структурного соответствия, которое должно появится в Python 3.10. В целом они сожалеют о событиях последних лет, когда над языком посыпалось всё больше и больше синтаксического сахара. Оригинальные принципы, заложенные в Zen Python, будут забыты, а функциональная стабильность утрачена.
В Твиттере и других социальных сетях всегда присутствует критика, как это происходит сейчас в случае структурного совмещения паттернов. Фактически, эта тема уже интенсивно обсуждалась в сообществе Python. Руководящий совет Python рекомендовал принять предложения уже в декабре 2020 года. Тем не менее с принятием предложений эта тема реально закипела. Причина этого, несомненно, заключается в размере и разнообразии сообщества Python. Большинство программистов, вероятно, интересуются только обсуждениями расширений, которые решают их собственные проблемы. Другие разработки игнорируются до тех пор, пока PEP не будут приняты. Вероятно, это относится и к подбору структурных схем. Это открывает возможности для решения проблем, которые раньше были вряд ли возможны на Python. Например, это позволяет специалистам по данным писать соответствующие парсеры и компиляторы, для которых им ранее приходилось прибегать к функциональным или логическим языкам программирования.
Заключение
С принятием PEP дискуссия теперь перешла к более широкому сообществу Python. Кстати, Бретт Кэннон, член руководящего совета Python, в интервью отметил, что последнее слово еще не сказано: до первой бета-версии еще есть время для изменений, если возникнут проблемы в практически используемом коде. Он также указал на возможность изменения значения ключевого слова _ еще раз.
Спасибо за отличные статьи, видео!
Пожалуйста
Its great… But is hard
of course