]> granicus.if.org Git - python/commitdiff
Issue #16808: inspect.stack() now returns a named tuple instead of a tuple.
authorAntoine Pitrou <solipsis@pitrou.net>
Sun, 24 Aug 2014 14:50:28 +0000 (10:50 -0400)
committerAntoine Pitrou <solipsis@pitrou.net>
Sun, 24 Aug 2014 14:50:28 +0000 (10:50 -0400)
Patch by Daniel Shahaf.

Doc/library/inspect.rst
Lib/inspect.py
Lib/test/test_inspect.py
Misc/NEWS

index 359f83374ab1e90e62de2a0c64495f9e417334eb..2e209ebf5f6323f53b30fc49377023660bcb4a45 100644 (file)
@@ -881,11 +881,17 @@ Classes and functions
 The interpreter stack
 ---------------------
 
-When the following functions return "frame records," each record is a tuple of
-six items: the frame object, the filename, the line number of the current line,
+When the following functions return "frame records," each record is a
+:term:`named tuple`
+``FrameInfo(frame, filename, lineno, function, code_context, index)``.
+The tuple contains the frame object, the filename, the line number of the
+current line,
 the function name, a list of lines of context from the source code, and the
 index of the current line within that list.
 
+.. versionchanged:: 3.5
+   Return a named tuple instead of a tuple.
+
 .. note::
 
    Keeping references to frame objects, as found in the first element of the frame
index da1d4b25857b0e96aa3855d339354c4cae295ae9..4dd9ab1fd4d2a538dbd1d8a62e3e6aac524bfb8e 100644 (file)
@@ -1312,6 +1312,8 @@ def getlineno(frame):
     # FrameType.f_lineno is now a descriptor that grovels co_lnotab
     return frame.f_lineno
 
+FrameInfo = namedtuple('FrameInfo', ('frame',) + Traceback._fields)
+
 def getouterframes(frame, context=1):
     """Get a list of records for a frame and all higher (calling) frames.
 
@@ -1319,7 +1321,8 @@ def getouterframes(frame, context=1):
     name, a list of lines of context, and index within the context."""
     framelist = []
     while frame:
-        framelist.append((frame,) + getframeinfo(frame, context))
+        frameinfo = (frame,) + getframeinfo(frame, context)
+        framelist.append(FrameInfo(*frameinfo))
         frame = frame.f_back
     return framelist
 
@@ -1330,7 +1333,8 @@ def getinnerframes(tb, context=1):
     name, a list of lines of context, and index within the context."""
     framelist = []
     while tb:
-        framelist.append((tb.tb_frame,) + getframeinfo(tb, context))
+        frameinfo = (tb.tb_frame,) + getframeinfo(tb, context)
+        framelist.append(FrameInfo(*frameinfo))
         tb = tb.tb_next
     return framelist
 
index 0452445eeba67147843b6d14bf924902ab2f4325..d7466366dd273c19b8408c549afee416b6002642 100644 (file)
@@ -182,6 +182,14 @@ class TestInterpreterStack(IsTestBase):
              (modfile, 43, 'argue', ['            spam(a, b, c)\n'], 0))
         self.assertEqual(revise(*mod.st[3][1:]),
              (modfile, 39, 'abuse', ['        self.argue(a, b, c)\n'], 0))
+        # Test named tuple fields
+        record = mod.st[0]
+        self.assertIs(record.frame, mod.fr)
+        self.assertEqual(record.lineno, 16)
+        self.assertEqual(record.filename, mod.__file__)
+        self.assertEqual(record.function, 'eggs')
+        self.assertIn('inspect.stack()', record.code_context[0])
+        self.assertEqual(record.index, 0)
 
     def test_trace(self):
         self.assertEqual(len(git.tr), 3)
index fe74da65324107f7906e27c8581a35f572b1fda6..09afd98463dfd73efb15f385ef02b3a708d74cb1 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -124,6 +124,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #16808: inspect.stack() now returns a named tuple instead of a tuple.
+  Patch by Daniel Shahaf.
+
 - Issue #22236: Fixed Tkinter images copying operations in NoDefaultRoot mode.
 
 - Issue #2527: Add a *globals* argument to timeit functions, in order to