0Pricing
Python Academy · Aula

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():
    pass

asynccontextmanager

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())  # captured

Verificaçã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

  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