0Pricing
Python Academy · Aula

A instrução with em profundidade

Entenda como with funciona e por que evita vazamentos de recursos.

A instrução with em profundidade é uma aula grátis de Python Academy no CoddyKit. Esta é a aula 1 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

A instrução with garante que o código de configuração e de encerramento seja executado, mesmo quando ocorrem exceções.

Uso básico de with

with expr as var: — expr precisa retornar um gerenciador de contexto. var fica associado ao que quer que __enter__ retorne.
with open('/tmp/cm_test.txt','w') as f:
    f.write('hello')
print('file closed:', f.closed)

Por que with existe

Recursos como arquivos, bloqueios e conexões de banco de dados precisam ser liberados. with garante a limpeza mesmo se uma exceção interromper o corpo.
# Without with:
# f = open('f.txt')
# try: ...
# finally: f.close()
# With with:
# with open('f.txt') as f: ...
print('with is cleaner')

Vários gerenciadores de contexto

with open(a) as f, open(b) as g: abre dois recursos em uma única instrução. Ambos são fechados ao sair.
import tempfile, os
a = tempfile.mktemp(); b = tempfile.mktemp()
with open(a,'w') as fa, open(b,'w') as fb:
    fa.write('A'); fb.write('B')
os.unlink(a); os.unlink(b)
print('both closed')

with não suprime exceções

Por padrão, as exceções no corpo de with são propagadas. __exit__ pode suprimi-las retornando True.
try:
    with open('/nonexistent.txt') as f:
        pass
except FileNotFoundError as e:
    print('caught:', e)

Lock como gerenciador de contexto

threading.Lock() funciona como um gerenciador de contexto: with lock: garante que o bloqueio seja sempre liberado.
import threading
lock = threading.Lock()
with lock:
    print('locked section')
print('lock released')

Padrão de conexão com banco de dados

Uma conexão de banco de dados como gerenciador de contexto confirma a transação em caso de sucesso e desfaz a transação em caso de exceção — um padrão essencial.
# Typical DB pattern:
# with db.transaction() as conn:
#     conn.execute(sql)
# commits on success, rolls back on exception
print('db pattern demo')

Instruções with aninhadas

Instruções with aninhadas são perfeitamente válidas. O gerenciador de contexto interno sai primeiro, depois o externo.
import tempfile
tmp = tempfile.mktemp()
with open(tmp,'w') as outer:
    with open(tmp,'r+') as inner:
        outer.write('x')
import os; os.unlink(tmp)
print('nested exit order')

contextlib.suppress

contextlib.suppress(ExcType) ignora silenciosamente um tipo específico de exceção dentro do bloco with.
from contextlib import suppress
with suppress(FileNotFoundError):
    open('/does/not/exist.txt')
print('no error raised')

contextlib.redirect_stdout

contextlib.redirect_stdout(f) redireciona temporariamente a saída de print() para f.
from contextlib import redirect_stdout
import io
buf = io.StringIO()
with redirect_stdout(buf):
    print('captured')
print('got:', buf.getvalue())

ExitStack

contextlib.ExitStack gerencia uma quantidade dinâmica de gerenciadores de contexto — útil quando você não sabe quantos arquivos precisará abrir.
from contextlib import ExitStack
import tempfile, os
with ExitStack() as stack:
    files = [stack.enter_context(open(tempfile.mktemp(),'w')) for _ in range(3)]
    for f in files: f.write('x')
print('all closed')

Verificação rápida

O que contextlib.suppress(FileNotFoundError) faz?

Recapitulação

with garante a limpeza. Vários destinos podem ser usados em um único with. contextlib.suppress silencia erros específicos. ExitStack gerencia quantidades dinâmicas de gerenciadores de contexto.

Continue

Excelente trabalho! A próxima lição espera por você.

Perguntas Frequentes

A aula “A instrução with em profundidade” é grátis?

Sim — o texto completo de “A instrução with em profundidade” é 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 “A instrução with em profundidade”?

Entenda como with funciona e por que evita vazamentos de recursos. 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 1 de 4.

Quanto tempo leva a aula “A instrução with em profundidade”?

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