Python: Conhecendo a declaração With


A declaração a "with" foi inserida ao Python na PEP 343 em 2005. Com ela conseguimos tornar o código mais limpo, legível e seguro.

Resumidamente ela é um gerenciador de contexto reponsável por garantir que determinados recursos sejam liberados independente se o código deu sucesso ou erro.

O exemplo mais comum e de melhor entendimento é o de leitura de arquivos. Suponha que um arquivo é aberto. Quem irá garantir que o mesmo será fechado? Por mais que você coloque no código de forma explícita que ele deve ser fechado, se ocorrer uma exceção, sairá do escopo sem executar o restante do código pulando o fechamento.

Para esse caso normalmente usaríamos o try/finally, pois o finally iria garantir que o arquivo seria fechado. Mais lembre-se que o with alem de garantir segurança ele visa um código mais limpo e menos complexo.

Mas afinal, como é um código que utiliza o "with"? Veja abaixo: Na linha 1 utilizamos o "with", logo em seguida chamamos a função "open()" e por fim damos um apelido para essa função de "file". Como a função "open" é padrão do python elá já oferece suporte ao with e com isso ela se encarrega de sempre fechar o arquivo quando o escopo for finalizado.

A declação "with" consegue manipular funções que contenham os métodos __enter__() e __exit__(). Eles são chamados internamente, sendo o __enter__() logo no início e o __exit__() no final da execução.

Vejamos outro exemplo, agora com uma classe que criei: Vamos executar esse arquivo para podermos descobrir a ordem em que cada função é chamada:

Python: declaração With

Percebemos que a primeira função a ser executada é o construtor e logo em seguida a função __enter__()  é chamada. A função __exit__() só é chamada quando tudo que está dentro do escopo do "with" é finalizado.

Observe que na linha 17 chamamos uma função da classe Test e só conseguimos fazer isso pois na função __enter__() retornamos o "self" que é todo o escopo da classe.

Vale lembrar que na função __exit__() é obrigatório informar 4 parâmetros como mostrado na linha 9. Caso haja alguma exceção esses parâmetros irão conter dados referênte a exceção.

Comentários

Postagens mais visitadas deste blog

Oh My Zsh: Melhorando a produtividade do seu terminal

asdf-vm: Gerenciador de versão extensível com suporte a várias linguagens e ferramentas de desenvolvimento