contextlib: @contextmanager
Crie gerenciadores de contexto de forma concisa com o decorador de contextlib.
contextlib: @contextmanager é uma aula grátis de Python Academy no CoddyKit. Esta é a aula 3 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.
Por que usar contextlib?
contextlib.contextmanager permite escrever um gerenciador de contexto como uma função geradora em vez de uma classe, reduzindo o código repetitivo.
from contextlib import contextmanager
@contextmanager
def managed():
print("setup")
yield
print("teardown")
with managed():
print("inside")Produzindo um valor
O que você yield é associado à variável as na instrução with.
from contextlib import contextmanager
@contextmanager
def temp_list():
lst = []
yield lst
print(f"Final list: {lst}")
with temp_list() as lst:
lst.append(1)
lst.append(2)Tratamento de exceções em @contextmanager
Envolva o yield em um try/finally para garantir a limpeza mesmo quando ocorrer uma exceção.
from contextlib import contextmanager
@contextmanager
def safe_open(path):
f = open(path)
try:
yield f
finally:
f.close()
with safe_open("data.txt") as f:
print(f.read())Suprimindo exceções
Capture a exceção dentro da geradora para suprimir a exceção — o mesmo que retornar True de __exit__.
from contextlib import contextmanager
@contextmanager
def ignore_value_errors():
try:
yield
except ValueError:
pass
with ignore_value_errors():
raise ValueError("ignored")contextlib.suppress
contextlib.suppress(*exceptions) é um gerenciador de contexto pronto que suprime os tipos de exceção especificados.
from contextlib import suppress
with suppress(FileNotFoundError):
open("missing.txt")
print("continues")contextlib.closing
closing(obj) cria um gerenciador de contexto que chama obj.close() ao sair. É útil para objetos que têm close(), mas não têm __exit__.
from contextlib import closing
from urllib.request import urlopen
with closing(urlopen("https://example.com")) as page:
content = page.read()contextlib.nullcontext
nullcontext é um gerenciador de contexto que não realiza nenhuma operação. É útil quando um gerenciador de contexto é opcional.
from contextlib import nullcontext
def process(data, lock=None):
cm = lock if lock is not None else nullcontext()
with cm:
return [x*2 for x in data]contextlib.ExitStack
ExitStack permite gerenciar dinamicamente uma quantidade variável de gerenciadores de contexto.
from contextlib import ExitStack
files = ["a.txt", "b.txt", "c.txt"]
with ExitStack() as stack:
handles = [stack.enter_context(open(f)) for f in files]
data = [h.read() for h in handles]Reutilizando um @contextmanager
Um gerenciador de contexto baseado em geradora pode ser usado uma única vez por chamada. Chame a função decorada novamente para reutilizá-lo.
from contextlib import contextmanager
@contextmanager
def counter():
count = 0
yield lambda: count.__add__ # each call is independent
print("done")
with counter():
pass
with counter():
passasynccontextmanager
Para código assíncrono, use contextlib.asynccontextmanager para escrever gerenciadores async with como geradoras.
from contextlib import asynccontextmanager
@asynccontextmanager
async def async_session():
session = await create_session()
try:
yield session
finally:
await session.close()contextlib.redirect_stdout
Redirecione temporariamente a saída padrão para qualquer objeto semelhante a um arquivo.
import io
from contextlib import redirect_stdout
buf = io.StringIO()
with redirect_stdout(buf):
print("captured")
print(buf.getvalue()) # capturedVerificação rápida
Em uma geradora @contextmanager, onde o código de limpeza deve ser colocado para garantir que seja executado mesmo em caso de exceção?
Recapitulação
@contextmanager transforma uma geradora em um gerenciador de contexto. Use try/finally ao redor de yield para realizar uma limpeza segura. O módulo contextlib também fornece suppress, nullcontext, ExitStack e muito mais.
Perguntas Frequentes
A aula “contextlib: @contextmanager” é grátis?
Sim — o texto completo de “contextlib: @contextmanager” é 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 “contextlib: @contextmanager”?
Crie gerenciadores de contexto de forma concisa com o decorador de contextlib. 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 3 de 4.
Quanto tempo leva a aula “contextlib: @contextmanager”?
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
- A instrução with em profundidade
- Protocolo __enter__ e __exit__
- contextlib: @contextmanager
- Padrões práticos de gerenciadores de contexto