Выбор по образцу
Match сопоставляет значение с последовательностью образцов case. В простом примере используются строковые литералы, а case _ подходит к любому оставшемуся значению. Полные возможности структурного сопоставления шире проверки равенства; здесь изучается только начальная форма.
Задание источника
Страны canada, usa и germany имеют по два учебных тарифа: для веса до 1 кг включительно и более тяжёлых посылок. Неизвестная страна должна дать None. Числа — данные упражнения, не действующие тарифы перевозчиков.
def calculate_delivery_cost(country: str, weight: float) -> int | None:
match country:
case "canada":
return 600 if weight <= 1 else 900
case "usa":
return 800 if weight <= 1 else 1200
case "germany":
return 700 if weight <= 1 else 1000
case _:
return None
В исходном решении внутри case используется обычный if. Здесь его короткий эквивалент записан условным выражением; таблица и границы сохранены.
Проверка порога
Для canada и 0,5 ответ 600, для canada и 2 — 900. Для usa и ровно 1 кг ответ 800, поскольку граница включена в первый тариф. France даёт None независимо от веса.
Что не проверяется
Веса предполагаются корректными неотрицательными значениями. Отрицательный вес не отклоняется автоматически и попал бы в первую ветвь. Регистр страны не нормализуется: Canada отличается от canada. Эти ограничения нужно задать отдельно перед использованием функции как реального интерфейса.
Синтаксис версии
Match и запись объединения типов int | None в таком виде рассчитаны на Python 3.10 и новее. Отступы после case обязательны; пустой блок только с комментарием не является полноценным исполняемым телом.
Hexlet / Code Basics и участники · Исходный урок и решение · GNU AGPL v3. Тарифная таблица сохранена; сокращение ветвей отмечено.