Pular para o conteúdo
Skillpedia
Código em geral41 mil · #4934

python-resource-management

Ajuda seu agente a gerenciar recursos como arquivos e conexões. Garante que tudo seja fechado corretamente após o uso.

O que ela faz

Essa habilidade ajuda a gerenciar recursos em programação Python, garantindo que eles sejam liberados corretamente, mesmo se ocorrerem erros. É útil para lidar com conexões de banco de dados, arquivos e outras tarefas que precisam de limpeza organizada.

Quando usar

  • ✓Ao abrir e fechar conexões com bancos de dados.
  • ✓Ao ler ou escrever em arquivos.
  • ✓Quando você precisa garantir que algo seja limpo após o uso, como fechar uma conexão de rede.

Exemplo do que pedir para a IA

“Como posso garantir que um arquivo seja fechado automaticamente depois de usá-lo em Python?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/wshobson/agents/blob/main/plugins/python-development/skills/python-resource-management/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/wshobson/agents/blob/main/plugins/python-development/skills/python-resource-management/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Ela usa um padrão chamado 'gerenciador de contexto' com a instrução `with`. Isso garante que, ao terminar de usar um recurso (como um arquivo ou conexão), ele seja fechado ou liberado automaticamente, mesmo que ocorra um erro no meio do caminho.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add wshobson/agents --skill python-resource-management

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/wshobson/agents/main/plugins/python-development/skills/python-resource-management/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Gerenciamento de Recursos em Python

Gerencie recursos de forma determinística usando gerenciadores de contexto. Recursos como conexões de banco de dados, manipuladores de arquivos e soquetes de rede devem ser liberados de forma confiável, mesmo quando ocorrem exceções.

Quando Usar Esta Habilidade

  • Gerenciamento de conexões de banco de dados e pools de conexão
  • Trabalhando com manipuladores de arquivos e I/O
  • Implementando gerenciadores de contexto personalizados
  • Construindo respostas de streaming com estado
  • Lidando com limpeza de recursos aninhados
  • Criando gerenciadores de contexto assíncronos

Conceitos Principais

1. Gerenciadores de Contexto

A instrução with garante que os recursos sejam liberados automaticamente, mesmo em caso de exceções.

2. Métodos de Protocolo

__enter__/__exit__ para gerenciamento de recursos síncronos, __aenter__/__aexit__ para gerenciamento de recursos assíncronos.

3. Limpeza Incondicional

__exit__ sempre é executado, independentemente de ter ocorrido uma exceção.

4. Tratamento de Exceções

Retorne True de __exit__ para suprimir exceções, False para propagá-las.

Início Rápido

from contextlib import contextmanager

@contextmanager
def managed_resource():
    resource = acquire_resource()
    try:
        yield resource
    finally:
        resource.cleanup()

with managed_resource() as r:
    r.do_work()

Padrões Fundamentais

Padrão 1: Gerenciador de Contexto Baseado em Classe

Implemente o protocolo de gerenciador de contexto para recursos complexos.

class DatabaseConnection:
    """Database connection with automatic cleanup."""

    def __init__(self, dsn: str) -> None:
        self._dsn = dsn
        self._conn: Connection | None = None

    def connect(self) -> None:
        """Establish database connection."""
        self._conn = psycopg.connect(self._dsn)

    def close(self) -> None:
        """Close connection if open."""
        if self._conn is not None:
            self._conn.close()
            self._conn = None

    def __enter__(self) -> "DatabaseConnection":
        """Enter context: connect and return self."""
        self.connect()
        return self

    def __exit__(
        self,
        exc_type: type[BaseException] | None,
        exc_val: BaseException | None,
        exc_tb: TracebackType | None,
    ) -> None:
        """Exit context: always close connection."""
        self.close()

# Usage with context manager (preferred)
with DatabaseConnection(dsn) as db:
    result = db.execute(query)

# Manual management when needed
db = DatabaseConnection(dsn)
db.connect()
try:
    result = db.execute(query)
finally:
    db.close()

Padrão 2: Gerenciador de Contexto Assíncrono

Para recursos assíncronos, implemente o protocolo assíncrono.

class AsyncDatabasePool:
    """Async database connection pool."""

    def __init__(self, dsn: str, min_size: int = 1, max_size: int = 10) -> None:
        self._dsn = dsn
        self._min_size = min_size
        self._max_size = max_size
        self._pool: asyncpg.Pool | None = None

    async def __aenter__(self) -> "AsyncDatabasePool":
        """Create connection pool."""
        self._pool = await asyncpg.create_pool(
            self._dsn,
            min_size=self._min_size,
            max_size=self._max_size,
        )
        return self

    async def __aexit__(
        self,
        exc_type: type[BaseException] | None,
        exc_val: BaseException | None,
        exc_tb: TracebackType | None,
    ) -> None:
        """Close all connections in pool."""
        if self._pool is not None:
            await self._pool.close()

    async def execute(self, query: str, *args) -> list[dict]:
        """Execute query using pooled connection."""
        async with self._pool.acquire() as conn:
            return await conn.fetch(query, *args)

# Usage
async with AsyncDatabasePool(dsn) as pool:
    users = await pool.execute("SELECT * FROM users WHERE active = $1", True)

Padrão 3: Usando o Decorador @contextmanager

Simplifique gerenciadores de contexto com o decorador para casos diretos.

from contextlib import contextmanager, asynccontextmanager
import time
import structlog

logger = structlog.get_logger()

@contextmanager
def timed_block(name: str):
    """Cronometra um bloco de código."""
    start = time.perf_counter()
    try:
        yield
    finally:
        elapsed = time.perf_counter() - start
        logger.info(f"{name} concluído", duration_seconds=round(elapsed, 3))

# Uso
with timed_block("processamento_de_dados"):
    process_large_dataset()

@asynccontextmanager
async def database_transaction(conn: AsyncConnection):
    """Gerencia transação de banco de dados."""

…
Perguntas frequentes

O que acontece se ocorrer um erro enquanto estou usando um recurso?

O gerenciador de contexto garante que a limpeza (como fechar um arquivo) ainda aconteça, mesmo que um erro ocorra. Isso evita que recursos fiquem abertos desnecessariamente.

O que são 'context managers'?

São blocos de código especiais que preparam um recurso antes de você usá-lo e garantem que ele seja limpo depois, usando a palavra-chave `with`.

Isso funciona para código assíncrono (async)?

Sim, existem versões especiais para código assíncrono (`async with`) que funcionam da mesma maneira para gerenciar recursos em operações que não bloqueiam o programa.

Detalhes

Descrição original do autor

Python resource management with context managers, cleanup patterns, and streaming. Use when managing connections, file handles, implementing cleanup logic, or building streaming responses with accumulated state.

repo: wshobson/agents

Popularidade

Estrelas no GitHub
41 mil
Posição no ranking
#4934
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas