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
Mensagem pronta para colar
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-managementOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/wshobson/agents/main/plugins/python-development/skills/python-resource-management/SKILL.md -o SKILL.mdConteú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
Comentários
- …
Mais skills deste repositório
screen-reader-testing
Faz seu agente testar sites usando leitores de tela para garantir que sejam acessíveis.
wshobson/agents
wcag-audit-patterns
Ajuda seu agente a auditar sites para acessibilidade e corrigir problemas de acordo com as diretrizes WCAG.
wshobson/agents
multi-reviewer-patterns
Faz seu agente coordenar revisões de código paralelas, deduplicando achados e consolidando relatórios.
wshobson/agents
parallel-debugging
Permite ao agente depurar problemas complexos com investigações paralelas e análise de causa raiz.
wshobson/agents
Skills parecidas
benchmark-optimization-loop
Faz seu agente melhorar a velocidade de algo de forma medida. Ele testa várias versões e escolhe a mais rápida que ainda funciona corretamente.
affaan-m/ECC
change-impact
Ajuda seu agente a analisar o impacto de mudanças no código antes de fazê-las. Ele compara o planejado com o real depois, cobrindo caminhos, dados, testes e documentação. É útil para mudanças arriscadas ou que afetam várias partes do sistema.
affaan-m/ECC
click-path-audit
Faz seu agente rastrear todos os botões e interações do usuário para achar bugs. Ele encontra problemas onde funções parecem funcionar sozinhas, mas falham juntas. Útil quando bugs persistem mesmo após depuração.
affaan-m/ECC