# 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.