diff options
-rw-r--r-- | Lib/atexit.py | 14 | ||||
-rw-r--r-- | Lib/test/output/test_atexit | 4 | ||||
-rw-r--r-- | Lib/test/test_atexit.py | 59 |
3 files changed, 53 insertions, 24 deletions
diff --git a/Lib/atexit.py b/Lib/atexit.py index 61f2458..b5929fc 100644 --- a/Lib/atexit.py +++ b/Lib/atexit.py @@ -29,15 +29,11 @@ def register(func, *targs, **kargs): _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) +if hasattr(sys, "exitfunc"): + # Assume it's another registered exit function - append it to our list + register(sys.exitfunc) +sys.exitfunc = _run_exitfuncs + del sys if __name__ == "__main__": diff --git a/Lib/test/output/test_atexit b/Lib/test/output/test_atexit deleted file mode 100644 index 1cc01de..0000000 --- a/Lib/test/output/test_atexit +++ /dev/null @@ -1,4 +0,0 @@ -test_atexit -handler2 (7,) {'kw': 'abc'} -handler2 () {} -handler1 diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py index 517610b..07f5a7e 100644 --- a/Lib/test/test_atexit.py +++ b/Lib/test/test_atexit.py @@ -1,5 +1,9 @@ -# Test the exit module -from test_support import verbose +# Test the atexit module. +from test_support import TESTFN, vereq +import atexit +import os + +input = """\ import atexit def handler1(): @@ -8,17 +12,50 @@ def 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") +""" + +fname = TESTFN + ".py" +f = file(fname, "w") +f.write(input) +f.close() + +p = os.popen("python " + fname) +output = p.read() +p.close() +vereq(output, """\ +handler2 (7,) {'kw': 'abc'} +handler2 () {} +handler1 +""") + +input = """\ +def direct(): + print "direct exit" + +import sys +sys.exitfunc = direct + +# Make sure atexit doesn't drop +def indirect(): + print "indirect exit" + +import atexit +atexit.register(indirect) +""" + +f = file(fname, "w") +f.write(input) +f.close() -# simulate exit behavior by calling atexit._run_exitfuncs directly... -atexit._run_exitfuncs() +p = os.popen("python " + fname) +output = p.read() +p.close() +vereq(output, """\ +indirect exit +direct exit +""") -# restore exit handlers -atexit._exithandlers = _exithandlers +os.unlink(fname) |