Программы
Новый оператор match-case в Python

Новый оператор match-case в Python

В новой версии Python (3.10) появится новый оператор. Новый оператор сопоставления по шаблону (match-case).

От версии к версии Python дарит нам разные новые возможности сделать наш код более понятным, более подходящим под задачи. На этот раз - появится оператор match-case. В некотором смысле он похож на паттерн-матчинг оператор из функциональных языков.

В общем случае его можно описать как расширенный switch-case, однако, куда более крутой:

    match command.split():
        case ["quit"]: ... # Code omitted for brevity
        case ["go", direction]: ...
        case ["drop", *objects]: ...
        ... # Other cases
        case _:
            print(f"Sorry, I couldn't understand {command!r}")

В match мы указываем значение для сопоставления, в case - значения, которые могут подходить. При чём, это могут быть композитные значения.

В предложенном примере после метода split значением будет массив - введённая команда, разделённая на части по пробелу. Тогда благодаря match-case мы можем обработать разные ситуации: когда одно слово "quit", когда несколько слов а ля "go" и какое-то "направление" и т.д.

Иными словами, от входящего значения мы можем описать разные сценарии. При предыдущих "if-else" это было бы не так просто, не так очевидно.

Более того! Мы можем использовать сопоставление с образцом - объектом. То есть (если вы такой ленивец-негодяй-панк, что не следите за типами в апи) можно обрабатывать входящие данные без isinstance:

    match event.get():
        case Click(position=(x, y)):
            handle_click_at(x, y)
        case KeyPress(key_name="Q") | Quit():
            game.quit()
        case KeyPress(key_name="up arrow"):
            game.go_north()
        ...
        case KeyPress():
            pass # Ignore other keystrokes
        case other_event:
            raise ValueError(f"Unrecognized event: {other_event}")

Разные типы - разные обработчики! Равно как и разные значения типов...

Можно также использовать позиционные атрибуты (это по мне - вообще рвань!):

    from dataclasses import dataclass

    @dataclass
    class Click:
        position: tuple
        button: Button


    match event.get():
        case Click((x, y)):
            handle_click_at(x, y)

Или без dataclass через магический аттрибут __match_args__ = ["position", "button"] - ещё одна фигня, на которой будут отыгрываться "злые" рекрутеры.

Вам мало? Вот ещё это работает с "or":

    case 401 | 403 | 404:
        return "Not allowed"

или диктами:

    case {"text": str(message), "color": str(c)}:
        ui.set_text_color(c)
        ui.display(message)

"Ахаха, Девид Блейн, прекрати!" - держите ещё guard-условия:

    case Point(x, y) if x == y:
        print(f"Y=X at {x}")

В общем, завезли много нового, пусть и в одном операторе.

Также может быть вам интересно:

Нет слов, одни... однострочники

На днях вышел пост со списком полезных однострочников для JavaScript программистов. Памятуя Perl-овую молодость, заглянул туда.

Читать »

Добавляем постраничную пагинацию на Django сайт

На сайтах часто встречаются многостраничные объекты: список товаров, список заметок и т.д. Поэтому важно уметь добавить навигацию по страницам на Django-проекте.

Читать »
Фото Как настроить отправку почты из Django

Как настроить отправку почты из Django

Письма об ошибках, отчёты на почту, восстановление паролей - всё это полезно при работе с сайтом. Django предоставляет удобный способ это сделать с минимумом настроек!

Фото Добавляем поддержку медиа-файлов в Django проект

Добавляем поддержку медиа-файлов в Django проект

Современные сайты редко ограничиваются только текстом и вёрсткой. Часто в заметках красуются фотографии, а рядом с описанием товаров - их изображения.

Фото Настройка журналирования (логирования) в Python с примерами

Настройка журналирования (логирования) в Python с примерами

Во время работы программы часто нужно сохранять некоторые важные записи о процессе выполнения команды. В Python есть довольно мощный модуль для работы с логами - давайте разберёмся с тем, как его использовать.

Фото Маленькая книга о Go (golang)

Маленькая книга о Go (golang)

Маленькая книга о Go распространяется под лицензией Attribution-NonCommercial-ShareAlike 4.0 International license. Вы не должны платить за эту книгу.

Фото Разграничение прав доступа на Django сайте

Разграничение прав доступа на Django сайте

Почти на любом веб-сайте необходимо разделять пользователей на группы и предоставлять им разные возможности. В Django есть довольно серьёзная система прав доступа для пользователей - давайте её рассмотрим!

Фото Пользователи и их создание в Django - своя регистрация на сайте

Пользователи и их создание в Django - своя регистрация на сайте

Если вашим сайтом должны активно пользоваться несколько человек, то полезно их различать, а значит - надо уметь создавать пользователей, либо предоставлять возможность регистрации Django пользователей.

Фото Как на Bash посчитать число строк в проекте (директории)

Как на Bash посчитать число строк в проекте (директории)

Ниже будет представлен однострочник, решающий данную задачу на Bash + пошаговое описание его работы.

Фото Пользователи и авторизация (логин) в Django, кастомизация пользователя

Пользователи и авторизация (логин) в Django, кастомизация пользователя

В Django есть множество встроенных возможностей, которые позволяют не реализовывать многие классы для стандартных операций. Среди них - авторизация. Django изначально предоставляет пользовательскую систему. Но её можно использовать лучше, чем по умолчанию.