bpo-31299: make it possible to filter out frames from tracebacks (GH-28067)

This commit is contained in:
Irit Katriel 2021-08-31 21:42:08 +01:00 committed by GitHub
parent 22fe0eb13c
commit 863154c929
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 34 additions and 1 deletions

View file

@ -357,7 +357,8 @@ capture data for later printing in a lightweight fashion.
Returns a string for printing one of the frames involved in the stack.
This method gets called for each frame object to be printed in the
:class:`StackSummary`.
:class:`StackSummary`. If it returns ``None``, the frame is omitted
from the output.
.. versionadded:: 3.11

View file

@ -1514,6 +1514,34 @@ def some_inner():
s.format(),
[f'{__file__}:{some_inner.__code__.co_firstlineno + 1}'])
def test_dropping_frames(self):
def f():
1/0
def g():
try:
f()
except:
return sys.exc_info()
exc_info = g()
class Skip_G(traceback.StackSummary):
def format_frame(self, frame):
if frame.name == 'g':
return None
return super().format_frame(frame)
stack = Skip_G.extract(
traceback.walk_tb(exc_info[2])).format()
self.assertEqual(len(stack), 1)
lno = f.__code__.co_firstlineno + 1
self.assertEqual(
stack[0],
f' File "{__file__}", line {lno}, in f\n 1/0\n'
)
class TestTracebackException(unittest.TestCase):

View file

@ -515,6 +515,9 @@ def format(self):
last_name = None
count = 0
for frame in self:
formatted_frame = self.format_frame(frame)
if formatted_frame is None:
continue
if (last_file is None or last_file != frame.filename or
last_line is None or last_line != frame.lineno or
last_name is None or last_name != frame.name):

View file

@ -0,0 +1 @@
Add option to completely drop frames from a traceback by returning ``None`` from a :meth:`~traceback.StackSummary.format_frame` override.