Операторы switch в Python 3.10
Python 3.10 все еще находится на стадии альфа-тестирования, но в нем появятся некоторые новые интересные функции. В этой статье мы рассмотрим один из них - операторы switch, официально известные как сопоставление структурных шаблонов.
Оператор switch
обычно встречается в большинстве языков программирования и обеспечивают более аккуратный способ реализации условной логики. Он пригодятся, когда нужно оценить множество условий.
Сегодня мы увидим, как его использовать, и сравним различия кода с более традиционным подходом.
Старый способ выполнения условных операций.
Первый - это ваш стандартный оператор if-elif-else
, а второй - использование словарных сопоставлений «ключ-значение», чтобы полностью избежать операторов if
.
Перво-наперво нам нужен код. Мы объявим функцию get_mood(day: str) -> str
, которая возвращает строку, значение которой зависит от входного параметра.
Глупая маленькая функция, но подойдет для демонстрационных целей.
Реализуем это по классической if-методологии. Вот код:
def get_mood(day):
if day == 'Monday':
return 'Oh...'
if day == 'Thursday':
return 'Getting close!'
if day == 'Friday':
return 'Almost there!'
if day == 'Saturday' or day == 'Sunday':
return 'Weekend!!!'
return 'Meh...'
print(get_mood(day='Monday'))
# Oh...
print(get_mood(day='Wednesday'))
# Meh...
print(get_mood(day='Friday'))
# Almost there!
print(get_mood(day='Sunday'))
# Weekend!!!
Здесь нет ничего нового или революционного. Код прост для понимания, но слишком подробен, особенно когда несколько значений могут удовлетворять одному условию.
Мы можем «улучшить» или немного изменить ситуацию, полностью избегая операторов if
и написав функцию в виде сопоставлений «ключ-значение». Это также включает блок try except
для установки возвращаемого значения по умолчанию.
Вот фрагмент кода:
def get_mood(day):
mappings = {
'Monday': 'Oh...',
'Thursday': 'Getting close!',
'Friday': 'Almost there!',
'Saturday': 'Weekend!!!',
'Sunday': 'Weekend!!!'
}
try: return mappings[day]
except KeyError: return 'Meh...'
print(get_mood(day='Monday'))
# Oh...
print(get_mood(day='Wednesday'))
# Meh...
print(get_mood(day='Friday'))
# Almost there!
print(get_mood(day='Sunday'))
# Weekend!!!
Как видите, результаты идентичны, но мы не использовали условные операторы. Оба подхода будут работать нормально, но в Python всегда отсутствовал специальный оператор switch
.
Теперь давайте исправим это с помощью оператора switch в Python 3.10.
Согласно официальной документации:
Было добавлено структурное сопоставление с образцом в форме оператора соответствия и операторов case шаблонов со связанными действиями. Шаблоны состоят из последовательностей, отображений, примитивных типов данных, а также экземпляров классов. Сопоставление с образцом позволяет программам извлекать информацию из сложных типов данных, переходить к структуре данных и применять определенные действия на основе различных форм данных.
Ради простоты, сегодня мы остановимся на основах и исследуем все, что может предложить сопоставление структурных шаблонов, в другой раз.
Вернемся к нашей функции get_mood()
и перепишем ее с синтаксисом, похожим на оператор switch. В отличие от многих других языков программирования, Python использует ключевое слово match
вместо switch. Ключевое слово case идентично.
Вот фрагмент кода:
def get_mood(day):
match day:
case 'Monday':
return 'Oh...'
case 'Thursday':
return 'Getting close!'
case 'Friday':
return 'Almost there!'
case 'Saturday' | 'Sunday':
return 'Weekend!!!'
case _:
return 'Meh...'
print(get_mood(day='Monday'))
# Oh...
print(get_mood(day='Wednesday'))
# Meh...
print(get_mood(day='Friday'))
# Almost there!
print(get_mood(day='Sunday'))
# Weekend!!!
- Используйте ключевое слово case для оценки условия (case 'Monday' идентично if day == 'Monday')
- Разделите несколько условий с помощью оператора вертикальной черты - | - например, если два входных значения должны привести к одному и тому же возвращаемому значению
- Используйте оператор подчеркивания - _ -, чтобы указать действие по умолчанию.
Примечание:
- Python 3.10 принесет много интересных функций, но он все еще находится в альфа-версии. Поскольку он не готов к производству, не рекомендуется устанавливать его в качестве версии Python по умолчанию.