← Назад к вопросам

Где можно использовать match/case в API?

1.7 Middle🔥 81 комментариев
#Python Core#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Match/Case в API: практическое применение

Оператор match/case (структурное сопоставление, введённое в Python 3.10) — мощный инструмент для обработки различных структур данных в API. Рассмотрим ключевые сценарии использования.

1. Обработка HTTP методов и статус-кодов

Вместо цепочек if/elif, match/case делает код чище и выразительнее:

from fastapi import FastAPI, Request
from enum import Enum

class HTTPMethod(str, Enum):
    GET = "GET"
    POST = "POST"
    PUT = "PUT"
    DELETE = "DELETE"

def handle_request(method: str, path: str):
    match method:
        case "GET":
            return get_resource(path)
        case "POST":
            return create_resource(path)
        case "PUT":
            return update_resource(path)
        case "DELETE":
            return delete_resource(path)
        case _:
            return {"error": "Method not allowed"}, 405

2. Обработка структурированных ответов

Особенно полезно при работе с Pydantic моделями:

from pydantic import BaseModel
from typing import Union

class SuccessResponse(BaseModel):
    status: str = "success"
    data: dict

class ErrorResponse(BaseModel):
    status: str = "error"
    code: int
    message: str

def process_api_response(response: Union[SuccessResponse, ErrorResponse]):
    match response:
        case SuccessResponse(status="success", data=data):
            return {"result": data, "action": "process_data"}
        case ErrorResponse(status="error", code=code, message=msg):
            logger.error(f"API error {code}: {msg}")
            return {"action": "handle_error", "code": code}

3. Валидация и десериализация JSON

При обработке входящих запросов можно элегантно обрабатывать различные форматы:

@app.post("/api/v1/events")
def handle_event(body: dict):
    match body:
        case {"type": "user_created", "user_id": uid, "email": email}:
            return create_user_account(uid, email)
        case {"type": "order_placed", "order_id": oid, "total": amount}:
            return process_payment(oid, amount)
        case {"type": type_name, **rest}:
            return {"warning": f"Unknown event type: {type_name}"}
        case _:
            return {"error": "Invalid payload"}, 400

4. Обработка результатов асинхронных операций

Особенно удобно с типами вроде Optional и кортежей:

async def fetch_user_data(user_id: int):
    result = await db.get_user(user_id)
    
    match result:
        case (True, user_data):
            return {"status": "found", "data": user_data}
        case (False, error_msg):
            return {"status": "not_found", "error": error_msg}, 404
        case None:
            return {"status": "unknown_error"}, 500

5. Маршрутизация по типам ошибок

При обработке исключений:

from fastapi import HTTPException
from sqlalchemy.exc import IntegrityError
import asyncio

def handle_exception(exc: Exception):
    match exc:
        case HTTPException(status_code=code, detail=detail):
            return {"error": detail, "code": code}
        case IntegrityError():
            return {"error": "Database constraint violation"}, 409
        case asyncio.TimeoutError():
            return {"error": "Request timeout"}, 504
        case ValueError(args=args):
            return {"error": f"Invalid value: {args}"}, 422
        case _:
            return {"error": "Internal server error"}, 500

Преимущества match/case в API:

  • Читаемость — структурная логика явна и понятна
  • Безопасность — компилятор проверяет покрытие всех случаев
  • Производительность — быстрее множества if/elif
  • Масштабируемость — легко добавлять новые типы запросов
  • DRY принцип — не дублируем условия и распаковку данных

match/case — отличный выбор для API-слоя, особенно при работе с WebSocket, event-driven архитектурой и обработкой различных типов данных.

Где можно использовать match/case в API? | PrepBro