15.12.2022 Views

Python Eficaz

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

finally:

lock.release()

A versão do código com o comando with é melhor porque elimina a necessidade

de escrever o código repetitivo da construção try/finally. O módulo nativo

contextlib facilita tornar seus objetos e funções capazes de serem usados com o

comando with. Esse módulo contém o decorador contextmanager, que permite

uma única função ser usada com comandos with. Esse módulo é muito mais fácil

que definir uma nova classe com métodos especiais __enter__ e __exit__ (a

maneira-padrão de fazer as coisas).

Por exemplo, digamos que se queira incluir mais mensagens de depuração em

alguma região do código de um programa qualquer. O exemplo de código a

seguir define uma função que registra esses logs respeitando dois níveis de

severidade:

def my_function():

logging.debug('Some debug data')

logging.error('Error log here')

logging.debug('More debug data')

O nível de log default para o programa é WARNING, portanto apenas a

mensagem de erro será mostrada na tela quando a função for chamada.

my_function()

>>>

Error log here

Podemos, temporariamente, elevar o nível de log da função definindo um

gerenciador de contexto. Essa função auxiliar aumenta o nível de severidade do

log antes de rodar o código circunscrito pelo bloco with e reduz a severidade

depois que o bloco tiver sido executado.

@contextmanager

def debug_logging(level):

logger = logging.getLogger()

old_level = logger.getEffectiveLevel()

logger.setLevel(level)

try:

yield

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!