diff -r 16d23c358848 Lib/test/test_traceback.py --- a/Lib/test/test_traceback.py Sun Sep 13 21:09:17 2015 +0300 +++ b/Lib/test/test_traceback.py Mon Sep 14 20:17:55 2015 +0300 @@ -289,6 +289,31 @@ class TracebackFormatTests(unittest.Test self.assertEqual(ststderr.getvalue(), "".join(stfmt)) + def test_print_stack(self): + def prn(): + traceback.print_stack() + with captured_output("stderr") as stderr: + prn() + lineno = prn.__code__.co_firstlineno + self.assertEqual(stderr.getvalue().splitlines()[-4:], [ + ' File "%s", line %d, in test_print_stack' % (__file__, lineno+3), + ' prn()', + ' File "%s", line %d, in prn' % (__file__, lineno+1), + ' traceback.print_stack()', + ]) + + def test_format_stack(self): + def fmt(): + return traceback.format_stack() + result = fmt() + lineno = fmt.__code__.co_firstlineno + self.assertEqual(result[-2:], [ + ' File "%s", line %d, in test_format_stack\n' + ' result = fmt()\n' % (__file__, lineno+2), + ' File "%s", line %d, in fmt\n' + ' return traceback.format_stack()\n' % (__file__, lineno+1), + ]) + cause_message = ( "\nThe above exception was the direct cause " @@ -610,6 +635,16 @@ class MiscTracebackCases(unittest.TestCa # Local variable dict should now be empty. self.assertEqual(len(inner_frame.f_locals), 0) + def test_extract_stack(self): + def extract(): + return traceback.extract_stack() + result = extract() + lineno = extract.__code__.co_firstlineno + self.assertEqual(tuple(result[-1]), + (__file__, lineno+1, 'extract', 'return traceback.extract_stack()')) + self.assertEqual(tuple(result[-2]), + (__file__, lineno+2, 'test_extract_stack', 'result = extract()')) + class TestFrame(unittest.TestCase): diff -r 16d23c358848 Lib/traceback.py --- a/Lib/traceback.py Sun Sep 13 21:09:17 2015 +0300 +++ b/Lib/traceback.py Mon Sep 14 20:17:55 2015 +0300 @@ -181,11 +181,15 @@ def print_stack(f=None, limit=None, file stack frame at which to start. The optional 'limit' and 'file' arguments have the same meaning as for print_exception(). """ + if f is None: + f = sys._getframe().f_back print_list(extract_stack(f, limit=limit), file=file) def format_stack(f=None, limit=None): """Shorthand for 'format_list(extract_stack(f, limit))'.""" + if f is None: + f = sys._getframe().f_back return format_list(extract_stack(f, limit=limit)) @@ -198,6 +202,8 @@ def extract_stack(f=None, limit=None): line number, function name, text), and the entries are in order from oldest to newest stack frame. """ + if f is None: + f = sys._getframe().f_back stack = StackSummary.extract(walk_stack(f), limit=limit) stack.reverse() return stack