29.8. "atexit" --- Manipuladores de Saída
*****************************************

======================================================================

O módulo "atexit" define funções para registrar e cancelar o registro
de funções de limpeza. As funções assim registradas são executadas
automaticamente após a conclusão normal do intérprete. O módulo
"atexit" executa essas funções na ordem *reversa* na qual foram
registradas; se você inscrever "A", "B" e "C", no momento do término
do interpretador, eles serão executados na ordem "C", "B", "A" .

**Nota:** As funções registradas através deste módulo não são
invocadas quando o programa é morto por um sinal não tratado pelo
Python, quando um erro interno fatal do Python é detectado ou quando a
função "os._exit()" é invocada.

atexit.register(func, *args, **kwargs)

   Registre *func* como uma função a ser executada no término.
   Qualquer o argumento opcional que deve ser passado para *func* for
   passado como argumento para "register()". É possível registrar mais
   ou menos a mesma função e argumentos.

   Na terminação normal do programa (por exemplo, se "sys.exit()" for
   chamado ou a execução do módulo principal for concluída), todas as
   funções registradas serão chamadas por último, pela primeira ordem.
   A suposição é que os módulos de nível inferior normalmente serão
   importados antes dos módulos de nível superior e, portanto, devem
   ser limpos posteriormente.

   Se uma exceção é levantada durante a execução dos manipuladores de
   saída, um traceback é impresso (a menos que "SystemExit" seja
   levantado) e as informações de exceção sejam salvas. Depois de
   todos os manipuladores de saída terem tido a chance de executar a
   última exceção a ser levantada, é levantada novamente.

   Esta função retorna *func*, o que torna possível usá-la como um
   decorador.

atexit.unregister(func)

   Remove *func* da lista de funções a serem executadas no
   desligamento do interpretador. Depois de chamar "unregister()",
   *func* tem garantia de não ser chamado quando o interpretador é
   encerrado, mesmo que tenha sido registrado mais de uma vez.
   "unregister()" silenciosamente não faz nada se *func* não foi
   registrado anteriormente.

Ver também:

  Módulo "readline"
     Exemplo útil de "atexit" para ler e escrever arquivos de
     histórico de "readline".


29.8.1. Exemplo do "atexit"
===========================

O exemplo simples a seguir demonstra como um módulo pode inicializar
um contador de um arquivo quando ele é importado e salvar
automaticamente o valor atualizado do contador quando o programa
termina, sem depender que o aplicativo faça uma chamada explícita
nesse módulo na finalização.

   try:
       with open("counterfile") as infile:
           _count = int(infile.read())
   except FileNotFoundError:
       _count = 0

   def incrcounter(n):
       global _count
       _count = _count + n

   def savecounter():
       with open("counterfile", "w") as outfile:
           outfile.write("%d" % _count)

   import atexit
   atexit.register(savecounter)

Os argumentos posicional e de palavra-chave também podem ser passados
para "register()" para ser passada para a função registrada quando é
chamada

   def goodbye(name, adjective):
       print('Goodbye, %s, it was %s to meet you.' % (name, adjective))

   import atexit
   atexit.register(goodbye, 'Donny', 'nice')

   # or:
   atexit.register(goodbye, adjective='nice', name='Donny')

Utilizado como um *decorator* de função:

   import atexit

   @atexit.register
   def goodbye():
       print("You are now leaving the Python sector.")

Isso só funciona com funções que podem ser invocadas sem argumentos.
