Смотрю на реализацию паттерн матчинга в питоне и прям неплохо сделали.
На всякий случай, если кто-то путает паттерн матчинг и switch/case это немного разные штуки.
Паттерн матчинг, подразумевает разворачивание значений из контейнера.
Например, вот как это классно сделано в хаскеле
someF :: [Int] -> String
someF [] = "This list is empty"
someF [x:xs] = "This list contain an element: " ++ x
У нас есть функция, которая принимает на вход список чисел. Если список пустой — выводит сообщение что список пустой, а если не пустой, то выводит его первый элемент.
Но можно пойти дальше и добавить ещё вот такую функцию, если мы хотим выводить отдельное сообщение для списков, которые начинаются с единицы:
someD [1:xs] = "This lists starts with one”
Вот в питоне тоже сделали что-то подобное. Правда система типов в питоне не такая гибкая как в хаскеле, как мне кажется (наверное, там и не нужно, впрочем, я не очень хорошо знаю питон)
А еще в 3.10 питоне обавили оператор или для типов
И можно применять вполне себе функциональные конструкторы:
если у вас есть два Datatype (например Just(value) и Nothing) то вы можете определить тип Maybe так же как и в хаскеле
Maybe = Just | Nothing
и потом применять его в паттерн матчинге
def func(value: Maybe)
match value:
case Just(a):
print(a)
case Nothing:
print(“Nothing to do here”)
Это очень полезно и здорово и позволит избегать исключений в будущем (если они вам не нравятся также сильно как и мне)