"atexit" --- Gestores de Salida
*******************************

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

El módulo "atexit" define funciones para registrar y cancelar el
registro de las funciones de limpieza. Las funciones así registradas
se ejecutan automáticamente cuando el intérprete se detiene
normalmente. El módulo "atexit" realiza estas funciones en el orden
inverso en el que se registraron; si ingresa "A", "B", y "C", cuando
el intérprete se detenga, se ejecutarán en el orden "C", "B", "A".

**Nota:** Las funciones registradas a través de este módulo no se
invocan cuando el programa es eliminado por una señal no gestionada
por Python, cuando se detecta un error fatal interno en Python o
cuando se llama a la función "os._exit()".

Distinto en la versión 3.7: Cuando se usan con sub-intérpretes API C,
las funciones registradas son locales para el intérprete en el que se
registraron.

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

   Registra *func* como una función que se ejecutará cuando el
   intérprete se detenga. Cualquier argumento opcional que deba
   pasarse a *func* debe pasarse como un argumento para la función
   "register()". Es posible registrar las mismas funciones y
   argumentos más de una vez.

   En la finalización normal del programa (por ejemplo, si se llama a
   la función "sys.exit()" o finaliza la ejecución del módulo
   principal), todas las funciones registradas se invocan en el orden
   último en entrar, primero en salir. Se supone que los módulos de
   nivel más bajo normalmente se importarán antes que los módulos de
   nivel alto y, por lo tanto, se limpiarán al final.

   Si se lanza una excepción durante la ejecución de los gestores de
   salida, se muestra un seguimiento de llamada (a menos que se haya
   lanzado "SystemExit") y se guarda la información de la excepción.
   Después de que todos los controladores de fin de programa hayan
   tenido la oportunidad de ejecutarse, la última excepción que se
   lanzó se vuelve a lanzar.

   Esta función retorna *func*, lo que hace posible usarlo como
   decorador.

atexit.unregister(func)

   Elimina *func* de la lista de funciones que se ejecutarán cuando el
   intérprete se detenga. Después de llamar a la función
   "unregister()", se garantiza que *func* no se llamará cuando el
   intérprete se detenga, incluso si se ha registrado más de una vez.
   "unregister()" no hace nada y permanece en silencio en caso de que
   *func* no se haya registrado previamente.

Ver también:

  Módulo "readline"
     Un ejemplo útil del uso de "atexit" para leer y escribir archivos
     de historial "readline".


Ejemplo con "atexit"
====================

El siguiente ejemplo simple muestra cómo un módulo puede inicializar
un contador desde un archivo cuando se importa, y guardar el valor del
contador actualizado automáticamente cuando finaliza el programa, sin
necesidad de que la aplicación realice una llamada explícita en este
módulo cuando el intérprete se detiene.

   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)

Los argumentos posicionales y de palabras clave también se pueden
pasar a "register()" para volver a pasar a la función registrada
cuando se llama:

   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')

Usar como un *decorator*:

   import atexit

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

Esto solo funciona con funciones que se pueden invocar sin argumentos.
