В Python 3.10 к нам пришли операторы Switch/Case, которые во многом используются в других популярных языках программирования.
Цель этого руководства — познакомить вас с новым синтаксисом, который вы можете использовать в Python 3.10. Но давайте сначала узнаем, как мы пользовались операторами до Python 3.10?
Python до 3.10
В Python всегда было несколько решений, которые можно было использовать вместо оператора case или switch. Популярным примером является использование Python if-else-elif.
В этом ответе показан следующий пример:
if x == 'a':
# Do the thing
elif x == 'b':
# Do the other thing
if x in 'bc':
# Fall-through by not using elif, but now the default case includes case 'a'!
elif x in 'xyz':
# Do yet another thing
else:
# Do the default
Это довольно разумная альтернатива использованию оператора case.
Еще одно распространенное решение, которое вы найдете на StackOverflow и других веб-сайтах, — это использовать словарь Python, чтобы сделать что-то вроде этого:
choices = {'a': 1, 'b': 2}
result = choices.get(key, 'default')
Существуют и другие решения, использующие лямбда-выражения в словарях или функции в словарях. Это тоже правильные решения.
Использование if-elif-else, вероятно, было наиболее распространенным и наиболее удобочитаемым решением до выпуска Python 3.10.
Python 3.10 Switch/Case
- match (не swtch)
- case
>>> status_code = 400
>>> match status_code:
... case 400:
... print("bad request")
... case 200:
... print("good")
... case _:
print("Something else bad happened")
bad request
Этот код принимает код состояния и сообщает Python, что нужно сопоставить его с одним из случаев. Если условие не найдено, то регистр _ выведет ошибку по умолчанию.
Условия объединения:
Вы можете немного упростить операторы case, комбинируя условия, с которыми вы сравниваете. Например, вы можете проверить, соответствует ли шаблон status_code нескольким литералам. Для этого вы должны изменить свой код следующим образом: case 400|401|403
Вот полный пример:
>>> status_code = 400
>>> match status_code:
... case 400|401|403 :
... print("bad request")
... case 200:
... print("good")
... case _:
print("Something else bad happened")