Criando Gerenciadores de Contexto Personalizados
Deslize para mostrar o menu
Para aproveitar totalmente o poder dos gerenciadores de contexto em Python, é possível criar o seu próprio definindo uma classe que implemente os métodos __enter__ e __exit__. O método __enter__ é chamado quando a execução entra no contexto da instrução with, e seu valor de retorno é atribuído à variável após o as. O método __exit__ é invocado quando a execução sai do contexto, independentemente de sair normalmente ou devido a uma exceção. Esse design permite configurar e liberar recursos de forma segura e previsível, sendo especialmente útil para gerenciar arquivos, conexões de rede ou locks.
O método __exit__ recebe três argumentos: exc_type, exc_value e traceback. Eles fornecem detalhes sobre qualquer exceção que tenha ocorrido dentro do bloco de contexto. Se __exit__ retornar True, a exceção é suprimida; caso contrário, a exceção será propagada após a finalização. Ao implementar esses métodos, é possível controlar precisamente a lógica de configuração e limpeza do recurso, tornando o código mais robusto e fácil de manter.
class FileLogger:
def __init__(self, filename, logname):
self.filename = filename
self.logname = logname
self.file = None
self.log = None
def __enter__(self):
self.file = open(self.filename, "r")
self.log = open(self.logname, "a")
self.log.write(f"Opened file: {self.filename}\n")
return self.file
def __exit__(self, exc_type, exc_value, traceback):
if self.file:
self.file.close()
self.log.write(f"Closed file: {self.filename}\n")
if self.log:
self.log.close()
# Do not suppress exceptions
return False
O código a seguir demonstra uma classe de gerenciador de contexto personalizada FileLogger. Essa classe foi projetada para abrir um arquivo de destino para leitura e um arquivo de log para adicionar entradas de log. Ao entrar no contexto (usando a instrução with), ela registra o evento de abertura do arquivo. Ao sair do contexto – seja por execução normal ou por exceção – ela registra o evento de fechamento do arquivo e garante que ambos os arquivos sejam devidamente fechados. O método __exit__ não suprime exceções, permitindo que elas sejam propagadas após a finalização.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo