[Python-checkins] bpo-31299: make it possible to filter out frames from tracebacks (GH-28067)
iritkatriel
webhook-mailer at python.org
Tue Aug 31 16:42:19 EDT 2021
https://github.com/python/cpython/commit/863154c9292e70c5a8a1a3f22ef4ee42e2304281
commit: 863154c9292e70c5a8a1a3f22ef4ee42e2304281
branch: main
author: Irit Katriel <1055913+iritkatriel at users.noreply.github.com>
committer: iritkatriel <1055913+iritkatriel at users.noreply.github.com>
date: 2021-08-31T21:42:08+01:00
summary:
bpo-31299: make it possible to filter out frames from tracebacks (GH-28067)
files:
A Misc/NEWS.d/next/Library/2021-08-30-13-55-09.bpo-31299.9QzjZs.rst
M Doc/library/traceback.rst
M Lib/test/test_traceback.py
M Lib/traceback.py
diff --git a/Doc/library/traceback.rst b/Doc/library/traceback.rst
index 83d5c8c6fcbd3..7b230495b7b56 100644
--- a/Doc/library/traceback.rst
+++ b/Doc/library/traceback.rst
@@ -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
diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py
index 5d48e9d7ff039..d1967aabb29a1 100644
--- a/Lib/test/test_traceback.py
+++ b/Lib/test/test_traceback.py
@@ -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):
diff --git a/Lib/traceback.py b/Lib/traceback.py
index 4ad8c9a17b349..8d83fd9b517e6 100644
--- a/Lib/traceback.py
+++ b/Lib/traceback.py
@@ -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):
diff --git a/Misc/NEWS.d/next/Library/2021-08-30-13-55-09.bpo-31299.9QzjZs.rst b/Misc/NEWS.d/next/Library/2021-08-30-13-55-09.bpo-31299.9QzjZs.rst
new file mode 100644
index 0000000000000..1ffa0b15172ee
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2021-08-30-13-55-09.bpo-31299.9QzjZs.rst
@@ -0,0 +1 @@
+Add option to completely drop frames from a traceback by returning ``None`` from a :meth:`~traceback.StackSummary.format_frame` override.
\ No newline at end of file
More information about the Python-checkins
mailing list