diff options
author | Fred Drake <fdrake@acm.org> | 2000-06-28 15:07:31 (GMT) |
---|---|---|
committer | Fred Drake <fdrake@acm.org> | 2000-06-28 15:07:31 (GMT) |
commit | c19425d520527d93b82755cc8a9854388306515a (patch) | |
tree | 58f691fea63fde7ef3d055a8fad41bb6344ed4bc /Lib | |
parent | a05e293a219f0fbaf4301fa7a292b9578a523675 (diff) | |
download | cpython-c19425d520527d93b82755cc8a9854388306515a.zip cpython-c19425d520527d93b82755cc8a9854388306515a.tar.gz cpython-c19425d520527d93b82755cc8a9854388306515a.tar.bz2 |
Added the atexit module and documentation from Skip Montanaro
<skip@mojam.com>. Revisions to the markup to make it pass LaTeX, added
an index entry and a reference from the sys.exitfunc documentation.
This closes SourceForge patch #100620.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/atexit.py | 54 | ||||
-rw-r--r-- | Lib/test/output/test_atexit | 4 | ||||
-rw-r--r-- | Lib/test/test_atexit.py | 24 |
3 files changed, 82 insertions, 0 deletions
diff --git a/Lib/atexit.py b/Lib/atexit.py new file mode 100644 index 0000000..a311630 --- /dev/null +++ b/Lib/atexit.py @@ -0,0 +1,54 @@ +""" +atexit.py - allow programmer to define multiple exit functions to be executed +upon normal program termination. + +One public function, register, is defined. +""" + +_exithandlers = [] +def _run_exitfuncs(): + """run any registered exit functions + + _exithandlers is traversed in reverse order so functions are executed + last in, first out. + """ + + while _exithandlers: + func, targs, kargs = _exithandlers[-1] + apply(func, targs, kargs) + _exithandlers.remove(_exithandlers[-1]) + +def register(func, *targs, **kargs): + """register a function to be executed upon normal program termination + + func - function to be called at exit + targs - optional arguments to pass to func + kargs - optional keyword arguments to pass to func + """ + _exithandlers.append((func, targs, kargs)) + +import sys +try: + x = sys.exitfunc +except AttributeError: + sys.exitfunc = _run_exitfuncs +else: + # if x isn't our own exit func executive, assume it's another + # registered exit function - append it to our list... + if x != _run_exitfuncs: + register(x) +del sys + +if __name__ == "__main__": + def x1(): + print "running x1" + def x2(n): + print "running x2(%s)" % `n` + def x3(n, kwd=None): + print "running x3(%s, kwd=%s)" % (`n`, `kwd`) + + register(x1) + register(x2, 12) + register(x3, 5, "bar") + register(x3, "no kwd args") + diff --git a/Lib/test/output/test_atexit b/Lib/test/output/test_atexit new file mode 100644 index 0000000..1cc01de --- /dev/null +++ b/Lib/test/output/test_atexit @@ -0,0 +1,4 @@ +test_atexit +handler2 (7,) {'kw': 'abc'} +handler2 () {} +handler1 diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py new file mode 100644 index 0000000..517610b --- /dev/null +++ b/Lib/test/test_atexit.py @@ -0,0 +1,24 @@ +# Test the exit module +from test_support import verbose +import atexit + +def handler1(): + print "handler1" + +def handler2(*args, **kargs): + print "handler2", args, kargs + +# save any exit functions that may have been registered as part of the +# test framework +_exithandlers = atexit._exithandlers +atexit._exithandlers = [] + +atexit.register(handler1) +atexit.register(handler2) +atexit.register(handler2, 7, kw="abc") + +# simulate exit behavior by calling atexit._run_exitfuncs directly... +atexit._run_exitfuncs() + +# restore exit handlers +atexit._exithandlers = _exithandlers |