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/atexit.py | |
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/atexit.py')
-rw-r--r-- | Lib/atexit.py | 54 |
1 files changed, 54 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") + |