system/agents/stacks/python-ecosystem.md

Python Экосистема — Полный каталог

Версия: 1.0.0
Дата: 2025-12-20
Статус: Справочник


НАЗНАЧЕНИЕ

Единый справочник по Python библиотекам. Один раз изучили → всегда используем.


КАТЕГОРИЯ 1: HTTP КЛИЕНТЫ

Задача Стандарт Альтернатива НЕ использовать
Sync + Async httpx requests
Только Async (макс. скорость) aiohttp requests
Retry логика tenacity time.sleep
# СТАНДАРТ: httpx
import httpx

# Sync
response = httpx.get("https://api.example.com")

# Async
async with httpx.AsyncClient() as client:
    response = await client.get("https://api.example.com")

Почему httpx: HTTP/2, async+sync, type hints, совместим с requests API.


КАТЕГОРИЯ 2: ВАЛИДАЦИЯ ДАННЫХ

Задача Стандарт Альтернатива НЕ использовать
Валидация + сериализация Pydantic v2 Pydantic v1
Простые dataclass dataclasses attrs
Схемы API Pydantic marshmallow
# СТАНДАРТ: Pydantic v2
from pydantic import BaseModel, ConfigDict

class User(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: int
    name: str
    email: str

Почему Pydantic v2: FastAPI интеграция, OpenAPI, быстрее v1.


КАТЕГОРИЯ 3: КОНФИГУРАЦИЯ

Задача Стандарт Альтернатива НЕ использовать
Настройки приложения pydantic-settings dynaconf os.environ
.env файлы python-dotenv ручной парсинг
Сложные конфиги dynaconf hydra ConfigParser
# СТАНДАРТ: pydantic-settings
from pydantic_settings import BaseSettings

class Settings(BaseSettings):
    database_url: str
    api_key: str
    debug: bool = False

    class Config:
        env_file = ".env"

settings = Settings()

КАТЕГОРИЯ 4: ЛОГИРОВАНИЕ

Задача Стандарт Альтернатива НЕ использовать
Простое логирование loguru print()
Структурированные логи structlog logging
Production structlog + JSON loguru print()
# СТАНДАРТ: loguru (простой)
from loguru import logger

logger.info("Processing {count} items", count=42)

# СТАНДАРТ: structlog (production)
import structlog

log = structlog.get_logger()
log.info("processing", count=42, user_id=123)

Рекомендация: loguru для разработки, structlog для production.


КАТЕГОРИЯ 5: CLI ИНСТРУМЕНТЫ

Задача Стандарт Альтернатива НЕ использовать
CLI приложение Typer Click argparse
Простые скрипты argparse sys.argv
Rich вывод rich print()
# СТАНДАРТ: Typer
import typer

app = typer.Typer()

@app.command()
def hello(name: str, count: int = 1):
    for _ in range(count):
        typer.echo(f"Hello {name}")

if __name__ == "__main__":
    app()

Почему Typer: Type hints, автодополнение, от автора FastAPI.


КАТЕГОРИЯ 6: ОЧЕРЕДИ ЗАДАЧ

Задача Стандарт Альтернатива НЕ использовать
Async I/O задачи ARQ TaskIQ RQ
CPU задачи Celery Dramatiq BackgroundTasks
Простые задачи Huey RQ Celery
Планировщик APScheduler Celery Beat cron
ДЕРЕВО ВЫБОРА:

Задача < 5 сек?
├── ДА → BackgroundTasks (FastAPI встроенный)
│
└── НЕТ → Async или CPU?
          ├── Async (API, файлы) → ARQ + Redis
          └── CPU (расчёты) → Celery + Redis
Библиотека Скорость Сложность Broker
Huey ⭐⭐⭐⭐⭐ Низкая Redis
Dramatiq ⭐⭐⭐⭐⭐ Средняя Redis/RabbitMQ
ARQ ⭐⭐⭐⭐ Низкая Redis
Celery ⭐⭐⭐ Высокая Redis/RabbitMQ/SQS
RQ ⭐⭐ Низкая Redis

КАТЕГОРИЯ 7: БАЗЫ ДАННЫХ

SQL

Задача Стандарт Альтернатива НЕ использовать
ORM (async) SQLAlchemy 2.0 SQLModel SQLAlchemy 1.x
Миграции Alembic ручные SQL
PostgreSQL driver asyncpg psycopg3 psycopg2
SQLite driver aiosqlite sqlite3

NoSQL

Задача Стандарт Альтернатива НЕ использовать
MongoDB (ODM) Beanie ODMantic PyMongo sync
MongoDB (driver) Motor PyMongo sync
Redis redis-py (async) redis sync
# СТАНДАРТ: SQLAlchemy 2.0 async
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column

engine = create_async_engine("postgresql+asyncpg://...")

class Base(DeclarativeBase):
    pass

class User(Base):
    __tablename__ = "users"
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str]

КАТЕГОРИЯ 8: ТЕСТИРОВАНИЕ

Задача Стандарт Альтернатива НЕ использовать
Фреймворк pytest unittest
Async тесты pytest-asyncio anyio
HTTP моки respx responses
Фикстуры pytest fixtures setUp/tearDown
Покрытие pytest-cov
Моки pytest-mock unittest.mock
# СТАНДАРТ: pytest + httpx
import pytest
from httpx import AsyncClient, ASGITransport

@pytest.fixture
async def client(app):
    async with AsyncClient(
        transport=ASGITransport(app=app),
        base_url="http://test"
    ) as ac:
        yield ac

@pytest.mark.asyncio
async def test_endpoint(client):
    response = await client.get("/api/users")
    assert response.status_code == 200

КАТЕГОРИЯ 9: РАБОТА С ФАЙЛАМИ

Задача Стандарт Альтернатива НЕ использовать
Async файлы aiofiles sync open()
Пути pathlib os.path
Excel чтение openpyxl pandas xlrd
Excel запись openpyxl xlsxwriter
CSV csv (stdlib) pandas
JSON orjson ujson json
YAML ruamel.yaml PyYAML
PDF генерация reportlab weasyprint
PDF парсинг pypdf pdfplumber
# СТАНДАРТ: aiofiles + pathlib
import aiofiles
from pathlib import Path

async def read_file(path: Path) -> str:
    async with aiofiles.open(path, mode='r') as f:
        return await f.read()

КАТЕГОРИЯ 10: S3 / ОБЛАЧНЫЕ ХРАНИЛИЩА

Задача Стандарт Альтернатива НЕ использовать
AWS S3 (async) aioboto3 boto3 sync
AWS S3 (sync) boto3
MinIO aioboto3 minio
# СТАНДАРТ: aioboto3
import aioboto3

async def upload_to_s3(file, bucket: str, key: str):
    session = aioboto3.Session()
    async with session.client("s3") as s3:
        await s3.upload_fileobj(file, bucket, key)

КАТЕГОРИЯ 11: СЕРИАЛИЗАЦИЯ

Задача Стандарт Альтернатива НЕ использовать
JSON (быстрый) orjson ujson json
JSON (совместимость) json
MessagePack msgpack
Pickle pickle
# СТАНДАРТ: orjson
import orjson

data = {"name": "test", "value": 123}
json_bytes = orjson.dumps(data)  # bytes
json_str = orjson.dumps(data).decode()  # str

Почему orjson: В 10x быстрее stdlib json.


КАТЕГОРИЯ 12: ДАТА/ВРЕМЯ

Задача Стандарт Альтернатива НЕ использовать
Работа с датами datetime (stdlib) pendulum arrow
Таймзоны zoneinfo (stdlib) pytz
Парсинг дат dateutil strptime
# СТАНДАРТ: datetime + zoneinfo
from datetime import datetime
from zoneinfo import ZoneInfo

now_utc = datetime.now(ZoneInfo("UTC"))
now_moscow = now_utc.astimezone(ZoneInfo("Europe/Moscow"))

КАТЕГОРИЯ 13: ШАБЛОНЫ

Задача Стандарт Альтернатива НЕ использовать
HTML шаблоны Jinja2 Django templates
Простые строки f-strings % formatting

КАТЕГОРИЯ 14: ПАРСИНГ HTML

Задача Стандарт Альтернатива НЕ использовать
HTML парсинг BeautifulSoup4 lxml regex
XPath lxml parsel
CSS селекторы BeautifulSoup4 parsel

КАТЕГОРИЯ 15: ИЗОБРАЖЕНИЯ

Задача Стандарт Альтернатива НЕ использовать
Обработка Pillow ImageMagick
Ресайз Pillow
Конвертация Pillow

КАТЕГОРИЯ 16: КРИПТОГРАФИЯ

Задача Стандарт Альтернатива НЕ использовать
Хеширование паролей passlib bcrypt hashlib
JWT python-jose PyJWT самописное
Шифрование cryptography PyCrypto
Секреты secrets (stdlib) random
# СТАНДАРТ: passlib
from passlib.context import CryptContext

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

def hash_password(password: str) -> str:
    return pwd_context.hash(password)

def verify_password(plain: str, hashed: str) -> bool:
    return pwd_context.verify(plain, hashed)

КАТЕГОРИЯ 17: ТЕРМИНАЛ / ВЫВОД

Задача Стандарт Альтернатива НЕ использовать
Красивый вывод rich print()
Прогресс бар rich / tqdm print()
Таблицы rich tabulate
Цвета rich colorama ANSI коды
# СТАНДАРТ: rich
from rich.console import Console
from rich.table import Table

console = Console()

table = Table(title="Users")
table.add_column("ID")
table.add_column("Name")
table.add_row("1", "Alice")

console.print(table)

КАТЕГОРИЯ 18: ASYNC УТИЛИТЫ

Задача Стандарт Альтернатива НЕ использовать
Event loop uvloop asyncio default
Concurrency asyncio.gather threading
Semaphore asyncio.Semaphore
# СТАНДАРТ: uvloop
import uvloop

uvloop.install()  # Ускоряет asyncio в 2-4x

КАТЕГОРИЯ 19: ВНЕШНИЕ API

Задача Стандарт Альтернатива НЕ использовать
Telegram python-telegram-bot aiogram telethon
Email aiosmtplib smtplib
AWS aioboto3 boto3

КАТЕГОРИЯ 20: DEV TOOLS

Задача Стандарт Альтернатива НЕ использовать
Линтер ruff flake8 pylint
Форматтер ruff format black autopep8
Type checker ty / mypy pyright
Pre-commit pre-commit
Версионирование uv poetry pip
# СТАНДАРТ: pyproject.toml + ruff
[tool.ruff]
line-length = 100
target-version = "py312"

[tool.ruff.lint]
select = ["E", "F", "I", "UP"]

BLACKLIST (НЕ ИСПОЛЬЗОВАТЬ)

Библиотека Причина Замена
Streamlit Не используем FastAPI + Jinja2
requests Sync only httpx
SQLAlchemy 1.x Legacy SQLAlchemy 2.0
Pydantic v1 Deprecated Pydantic v2
flask Sync, legacy FastAPI
django Другой стек FastAPI
celery (для I/O) Overkill ARQ
print() Непрофессионально loguru/structlog
os.environ Нет валидации pydantic-settings
json (stdlib) Медленный orjson

ССЫЛКИ

Awesome Lists

Best Practices


Версия: 1.0.0