Gerenciadores de contexto em Python
Um problema comum em programação é como gerenciar corretamente recursos externos, como arquivos e conexões de rede. Às vezes, um programa retêm recursos alocados, mesmo quando eles não são mais necessários. Esse tipo de problema é chamado de vazamento de memória. A memória disponível é reduzida toda vez que uma nova instância de um determinado recurso é criada e aberta sem fechar uma existente. Para evitar esse tipo de cenário, os gerenciadores de contexto são fundamentais.
Gerenciadores de contexto em Python são particularmente úteis para garantir que os recursos sejam adequadamente alocados e liberados, mesmo quando ocorrem exceções.
Em Python, existem duas abordagens gerais para lidar com o gerenciamento de recursos. Uma delas envolve encapsular os códigos em blocos try/except/finally. Embora essa abordagem funcione para muitos casos, ela é genérica e não é a mais acurada para tarefas de gerenciamento e alocação de recursos. A outra abordagem mais direta envolve o uso da instrução with. Sua sintaxe básica é mostrada abaixo:
with expressão [as variável]:
# bloco de código
Entenda como a instrução with prossegue
Internamente, Python define o protocolo do gerenciador de contexto usando dois métodos especiais: __enter__() e __exit__(). Eles são chamados no início e no final do bloco da instrução with, respectivamente.
O método __enter__() é chamado quando a instrução with é encontrada. Normalmente, ele é usado para alocar recursos e retornar um valor que pode ser usado dentro do bloco. O valor retornado por ele (se houver) é atribuído à variável especificada na instrução with. Quando o bloco de código termina a execução (ou se uma exceção é gerada), o método __exit__() é chamado. Esse método é responsável por limpar ou liberar os recursos adquiridos, independentemente de ter ocorrido uma exceção ou não.
Instrução with em código
Entenda como usar with para gerenciamento de contexto com um exemplo ilustrativo. Abaixo, criamos um arquivo sem o uso da instrução with. O problema desse tipo de procedimento é que o arquivo não será fechado se uma exceção for gerada.
# abertura e fechamento de um arquivo sem gerenciamento de contexto
file = open("oi.txt", "w") # abre um novo arquivo
file.write("Oi, mundo com Python!") # escreve no arquivo
file.close() # fecha o arquivo, se houver um erro acima, o fechamento do arquivo não será realizado corretamente
No exemplo abaixo, executamos a mesma operação, mas usando with. Com seu uso, garantimos o gerenciamento correto de recursos mesmo quando uma exceção ocorre.
# gerenciamento de contexto com a instrução with
with open("oi.txt", "w") as file:
file.write("Oi, mundo com Python!")
Portanto, mesmo quando um programa encontra uma exceção, a instrução with garante a alocação correta dos recursos.
Veja também:
Encontrou algum erro ou quer fazer uma sugestão? Por favor, entre em contato usando nosso formulário de contatos.