Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Criando Gerenciadores de Contexto Personalizados | Manipulação Avançada de Arquivos e Gerenciadores de Contexto
Programação Estrutural em Python

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.

question mark

Qual afirmação melhor descreve o papel do método __exit__ em um gerenciador de contexto personalizado?

Selecione a resposta correta

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 5

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Seção 2. Capítulo 5
some-alt