28.9. "atexit" — 退出处理器
***************************

2.0 新版功能.

**Source code:** Lib/atexit.py

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

The "atexit" module defines a single function to register cleanup
functions.  Functions thus registered are automatically executed upon
normal interpreter termination.  "atexit" runs these functions in the
*reverse* order in which they were registered; if you register "A",
"B", and "C", at interpreter termination time they will be run in the
order "C", "B", "A".

**注意:** 通过该模块注册的函数, 在程序被未被 Python 捕获的信号杀死时并
不会执行, 在检测到 Python 内部致命错误以及调用了 "os._exit()" 时也不会
执行.

This is an alternate interface to the functionality provided by the
"sys.exitfunc()" variable.

Note: This module is unlikely to work correctly when used with other
code that sets "sys.exitfunc".  In particular, other core Python
modules are free to use "atexit" without the programmer’s knowledge.
Authors who use "sys.exitfunc" should convert their code to use
"atexit" instead.  The simplest way to convert code that sets
"sys.exitfunc" is to import "atexit" and register the function that
had been bound to "sys.exitfunc".

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

   将 *func* 注册为终止时执行的函数.  任何传给 *func* 的可选的参数都应
   当作为参数传给 "register()".  可以多次注册同样的函数及参数.

   在正常的程序终止时 (举例来说, 当调用了 "sys.exit()" 或是主模块的执
   行完成时), 所有注册过的函数都会以后进先出的顺序执行. 这样做是假定更
   底层的模块通常会比高层模块更早引入, 因此需要更晚清理.

   If an exception is raised during execution of the exit handlers, a
   traceback is printed (unless "SystemExit" is raised) and the
   exception information is saved.  After all exit handlers have had a
   chance to run the last exception to be raised is re-raised.

   在 2.6 版更改: This function now returns *func*, which makes it
   possible to use it as a decorator.

参见:

  Module "readline"
     Useful example of "atexit" to read and write "readline" history
     files.


28.9.1. "atexit" 示例
=====================

The following simple example demonstrates how a module can initialize
a counter from a file when it is imported and save the counter’s
updated value automatically when the program terminates without
relying on the application making an explicit call into this module at
termination.

   try:
       _count = int(open("counter").read())
   except IOError:
       _count = 0

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

   def savecounter():
       open("counter", "w").write("%d" % _count)

   import atexit
   atexit.register(savecounter)

Positional and keyword arguments may also be passed to "register()" to
be passed along to the registered function when it is called:

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

作为 *decorator*: 使用:

   import atexit

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

只有在函数不需要任何参数调用时才能工作.
