Gerenciadores de Contexto
Parte da seção Object Oriented Programming do Journey de Python da Coddy — lição 41 de 64.
Gerenciadores de contexto permitem que você aloque e libere recursos precisamente quando necessário. Eles garantem a limpeza adequada mesmo se ocorrerem erros.
Aqui está o exemplo mais comum usando a instrução with:
with open('example.txt', 'w') as file:
file.write('Hello, world!')
# O arquivo é fechado automaticamente aquiO arquivo é fechado automaticamente após o bloco, mesmo que ocorra uma exceção.
Crie seu próprio gerenciador de contexto implementando os métodos __enter__ e __exit__:
class MyContext:
def __enter__(self):
print("Entering the context")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Exiting the context")
return False # Não suprima exceçõesUse seu gerenciador de contexto personalizado:
with MyContext() as ctx:
print("Inside the context")Saída:
Entering the context
Inside the context
Exiting the contextCrie um gerenciador de contexto mais prático para conexões de banco de dados:
class DatabaseConnection:
def __init__(self, db_name):
self.db_name = db_name
self.connection = None
def __enter__(self):
print(f"Connecting to {self.db_name}")
self.connection = f"Connection to {self.db_name}"
return self.connection
def __exit__(self, exc_type, exc_val, exc_tb):
print(f"Closing connection to {self.db_name}")
self.connection = None
with DatabaseConnection("users_db") as conn:
print(f"Using {conn}")
print("Performing database operations...")Lide com exceções em gerenciadores de contexto:
class SafeContext:
def __enter__(self):
print("Setting up resources")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Cleaning up resources")
if exc_type:
print(f"An exception occurred: {exc_val}")
return False # Não suprima a exceção
with SafeContext():
print("Working with resources")
# raise ValueError("Something went wrong") # Descomente para testarSaída:
Connecting to users_db
Using Connection to users_db
Performing database operations...
Closing connection to users_db
Setting up resources
Working with resources
Cleaning up resourcesO método __exit__ recebe três parâmetros:
exc_type: Tipo da exceção (ou None)exc_val: Valor da exceção (ou None)exc_tb: Traceback da exceção (ou None)
Ponto Chave: Gerenciadores de contexto usam os métodos __enter__ e __exit__ para gerenciar recursos. A instrução with chama automaticamente esses métodos, garantindo a configuração e a limpeza adequadas. Isso é especialmente útil para arquivos, conexões de banco de dados e outros recursos que precisam de limpeza garantida.
Desafio
FácilNeste desafio, você implementará uma classe de gerenciador de contexto que mede o tempo decorrido entre a entrada e a saída de um bloco de contexto.
timer.py- Contém a implementação da classeTimer(este é o arquivo que você editará)driver.py- Contém casos de teste abrangentes (não modifique)
Implemente o gerenciador de contexto Timer em timer.py seguindo os comentários TODO. A classe deve:
- Registrar o tempo de início ao entrar em um contexto
- Registrar o tempo de término ao sair
- Calcular e exibir o tempo decorrido
Folha de consulta
Gerenciadores de contexto alocam e liberam recursos precisamente quando necessário, garantindo a limpeza adequada mesmo se ocorrerem erros.
Use a instrução with para o gerenciamento automático de recursos:
with open('example.txt', 'w') as file:
file.write('Hello, world!')
# O arquivo é fechado automaticamente aquiCrie gerenciadores de contexto personalizados implementando os métodos __enter__ e __exit__:
class MyContext:
def __enter__(self):
print("Entering the context")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Exiting the context")
return False # Não suprime exceções
with MyContext() as ctx:
print("Inside the context")O método __exit__ recebe três parâmetros:
exc_type: Tipo da exceção (ou None)exc_val: Valor da exceção (ou None)exc_tb: Traceback da exceção (ou None)
Trate exceções em gerenciadores de contexto:
class SafeContext:
def __enter__(self):
print("Setting up resources")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Cleaning up resources")
if exc_type:
print(f"An exception occurred: {exc_val}")
return False # Não suprime a exceçãoExperimente você mesmo
from timer import Timer
import time
# Manipulador de casos de teste
test_case = input()
if test_case == "basic_test":
# Teste de funcionalidade básica
with Timer():
# Simula algum trabalho
time.sleep(2) # Isso faz o programa esperar por 2 segundos
elif test_case == "nested_contexts":
# Testa gerenciadores de contexto aninhados
with Timer():
time.sleep(1)
with Timer():
time.sleep(1)
elif test_case == "exception_handling":
# Testa o tratamento de exceções dentro do contexto
try:
with Timer():
time.sleep(1)
raise ValueError("Test exception")
except ValueError as e:
print(f"Caught exception: {e}")
elif test_case == "zero_sleep":
# Teste com sleep mínimo
with Timer():
time.sleep(0.001)
elif test_case == "multiple_timers":
# Testa múltiplos timers em sequência
with Timer():
time.sleep(1)
with Timer():
time.sleep(0.5)
with Timer():
time.sleep(2)
elif test_case == "as_decorator":
# Testa o timer em um contexto de função
def timed_function():
with Timer():
time.sleep(2)
timed_function()
else:
# Teste padrão - funcionalidade básica
with Timer():
# Simula algum trabalho
time.sleep(2) # Isso faz o programa esperar por 2 segundos
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Object Oriented Programming
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosO Parâmetro selfMétodosAtributosMétodo Construtor (__init__)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Função super()Sobrescrita de MétodoHerança MúltiplaOrdem de Resolução de MétodosRecapitulação - Hierarquia de Funcionários7Métodos Especiais
Introdução aos Métodos MágicosSobrecarga de OperadoresMétodos Mágicos de ContêinerRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução a Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy2Decoradores
Introdução aos DecoradoresDecorador de PropriedadeDecorador de Método EstáticoDecorador de Método de Classe5Polimorfismo
Sobrescrita de Método RevisitadaDuck TypingClasses e Métodos AbstratosDesign de InterfacesRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição vs HerançaMixinsMétodos Estáticos e de ClasseDecoradores de ClasseGerenciadores de Contexto11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Propriedades de Classe
Variáveis de Instância vs de ClasseDecoradores de PropriedadeAtributos PrivadosRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Membros Públicos, Protegidos e PrivadosModificadores de AcessoOcultação de InformaçãoProperty Decorators AvançadosRecapitulação - Sistema de Registro de Alunos12Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário