0Pricing
Python Academy · Aula

Padrões práticos de gerenciadores de contexto

Aplique gerenciadores de contexto a arquivos, bloqueios, cronômetros e conexões DB.

Padrões práticos de gerenciadores de contexto é uma aula grátis de Python Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Python Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Python Academy inclui 4 aulas no total.

Introdução

Os gerenciadores de contexto resolvem de forma elegante problemas reais de gerenciamento de recursos em arquivos, bancos de dados, bloqueios, temporizadores e muito mais.

Fluxo de processamento de arquivos

Abra os arquivos de entrada e saída juntos, processe-os linha por linha e feche ambos automaticamente.
import io
src = io.StringIO('line1\nline2\nline3')
dst = io.StringIO()
with src, dst:
    for line in src:
        dst.write(line.upper())
print(dst.getvalue())

Transação de banco de dados

Envolva as operações do banco de dados em um CM: confirme em caso de sucesso, desfaça em caso de exceção e sempre feche o recurso.
from contextlib import contextmanager
@contextmanager
def db_transaction(conn):
    try:
        yield conn
        print('COMMIT')
    except Exception as e:
        print(f'ROLLBACK: {e}')
        raise
    finally:
        print('CLOSE')
with db_transaction({'execute': lambda q: print(f'SQL: {q}')}) as db:
    db['execute']('INSERT ...')

Bloqueio para concorrência

with lock: adquire o bloqueio, executa o corpo e o libera ao sair — não é necessário chamar acquire/release manualmente.
import threading
lock = threading.Lock()
shared = []
def add(x):
    with lock:
        shared.append(x)
add(1); add(2)
print(shared)

Alterando o diretório

os.chdir() altera globalmente o diretório de trabalho. Um CM salva e restaura esse diretório.
from contextlib import contextmanager
import os
@contextmanager
def chdir(path):
    old = os.getcwd()
    os.chdir(path)
    try: yield
    finally: os.chdir(old)
original = os.getcwd()
with chdir('/tmp'):
    print('in tmp:', os.getcwd())
print('back:', os.getcwd())

Arquivos temporários

tempfile.NamedTemporaryFile como um CM cria e exclui automaticamente um arquivo temporário.
import tempfile
with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=True) as f:
    f.write('temp data')
    print('temp file:', f.name)
print('deleted')

Alteração temporária de variável de ambiente

Defina temporariamente uma variável de ambiente para um teste ou subprocesso e depois restaure-a.
from contextlib import contextmanager
import os
@contextmanager
def env(**kwargs):
    old = {k: os.environ.get(k) for k in kwargs}
    os.environ.update({k:str(v) for k,v in kwargs.items()})
    try: yield
    finally:
        for k,v in old.items():
            if v is None: os.environ.pop(k,None)
            else: os.environ[k]=v
with env(DEBUG='1', LOG_LEVEL='DEBUG'):
    print(os.environ['DEBUG'])

Bloco de análise de desempenho

Envolva um bloco com cProfile para medir seu desempenho dentro de um CM.
from contextlib import contextmanager
import cProfile
@contextmanager
def profile():
    pr = cProfile.Profile()
    pr.enable()
    yield pr
    pr.disable()
with profile() as pr:
    sum(range(1000000))
print('profiled')

Socket de rede

Os sockets implementam o protocolo de CM: with socket.socket() as s: fecha o socket ao sair.
import socket
try:
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.settimeout(0.1)
        print('socket ready')
except Exception as e:
    print(f'socket: {e}')

Capturando avisos

warnings.catch_warnings() captura os avisos emitidos dentro do bloco, o que é útil em testes.
import warnings
with warnings.catch_warnings(record=True) as w:
    warnings.simplefilter('always')
    warnings.warn('test warning')
print(len(w), w[0].category.__name__)

Combinando padrões

Os CMs do mundo real geralmente combinam vários padrões: transação + registro + medição de tempo em um único componente reutilizável.
from contextlib import contextmanager
import time
@contextmanager
def timed_operation(name):
    print(f'[{name}] start')
    t0 = time.perf_counter()
    try:
        yield
        print(f'[{name}] done in {time.perf_counter()-t0:.4f}s')
    except Exception as e:
        print(f'[{name}] failed: {e}')
        raise
with timed_operation('loop'):
    sum(range(100000))

Verificação rápida

Qual primitiva de concorrência implementa o protocolo de gerenciador de contexto para permitir acesso concorrente seguro?

Recapitulação

Padrões de gerenciadores de contexto: fluxos de arquivos, transações de banco de dados, bloqueios, alterações de diretório, arquivos temporários, alterações de variáveis de ambiente e análise de desempenho. Use ExitStack para pilhas dinâmicas de recursos.

Continue

Muito bem! A próxima lição espera por você.

Perguntas Frequentes

A aula “Padrões práticos de gerenciadores de contexto” é grátis?

Sim — o texto completo de “Padrões práticos de gerenciadores de contexto” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Python Academy, atualize para CoddyKit PRO. O curso de Python Academy inclui 4 aulas no total.

O que vou aprender em “Padrões práticos de gerenciadores de contexto”?

Aplique gerenciadores de contexto a arquivos, bloqueios, cronômetros e conexões DB. Você pratica Python Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Python Academy?

Nenhuma experiência prévia é necessária. Python Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Padrões práticos de gerenciadores de contexto”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Python Academy?

Sim. Cada aula de Python Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. A instrução with em profundidade
  2. Protocolo __enter__ e __exit__
  3. contextlib: @contextmanager
  4. Padrões práticos de gerenciadores de contexto
← Voltar para Python Academy