← Назад к вопросам
Где можно использовать 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 архитектурой и обработкой различных типов данных.