Skip to content

Commit 5644c7b

Browse files
ammaraskarpablogsalisidentical
authored
bpo-43950: Print columns in tracebacks (PEP 657) (GH-26958)
The traceback.c and traceback.py mechanisms now utilize the newly added code.co_positions and PyCode_Addr2Location to print carets on the specific expressions involved in a traceback. Co-authored-by: Pablo Galindo <[email protected]> Co-authored-by: Ammar Askar <[email protected]> Co-authored-by: Batuhan Taskaya <[email protected]>
1 parent 693cec0 commit 5644c7b

File tree

12 files changed

+348
-74
lines changed

12 files changed

+348
-74
lines changed

Doc/library/traceback.rst

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -447,37 +447,42 @@ The output for the example would look similar to this:
447447
*** print_tb:
448448
File "<doctest...>", line 10, in <module>
449449
lumberjack()
450+
^^^^^^^^^^^^
450451
*** print_exception:
451452
Traceback (most recent call last):
452453
File "<doctest...>", line 10, in <module>
453454
lumberjack()
455+
^^^^^^^^^^^^
454456
File "<doctest...>", line 4, in lumberjack
455457
bright_side_of_death()
458+
^^^^^^^^^^^^^^^^^^^^^^
456459
IndexError: tuple index out of range
457460
*** print_exc:
458461
Traceback (most recent call last):
459462
File "<doctest...>", line 10, in <module>
460463
lumberjack()
464+
^^^^^^^^^^^^
461465
File "<doctest...>", line 4, in lumberjack
462466
bright_side_of_death()
467+
^^^^^^^^^^^^^^^^^^^^^^
463468
IndexError: tuple index out of range
464469
*** format_exc, first and last line:
465470
Traceback (most recent call last):
466471
IndexError: tuple index out of range
467472
*** format_exception:
468473
['Traceback (most recent call last):\n',
469-
' File "<doctest...>", line 10, in <module>\n lumberjack()\n',
470-
' File "<doctest...>", line 4, in lumberjack\n bright_side_of_death()\n',
471-
' File "<doctest...>", line 7, in bright_side_of_death\n return tuple()[0]\n',
474+
' File "<doctest default[0]>", line 10, in <module>\n lumberjack()\n ^^^^^^^^^^^^\n',
475+
' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_death()\n ^^^^^^^^^^^^^^^^^^^^^^\n',
476+
' File "<doctest default[0]>", line 7, in bright_side_of_death\n return tuple()[0]\n ^^^^^^^^^^\n',
472477
'IndexError: tuple index out of range\n']
473478
*** extract_tb:
474479
[<FrameSummary file <doctest...>, line 10 in <module>>,
475480
<FrameSummary file <doctest...>, line 4 in lumberjack>,
476481
<FrameSummary file <doctest...>, line 7 in bright_side_of_death>]
477482
*** format_tb:
478-
[' File "<doctest...>", line 10, in <module>\n lumberjack()\n',
479-
' File "<doctest...>", line 4, in lumberjack\n bright_side_of_death()\n',
480-
' File "<doctest...>", line 7, in bright_side_of_death\n return tuple()[0]\n']
483+
[' File "<doctest default[0]>", line 10, in <module>\n lumberjack()\n ^^^^^^^^^^^^\n',
484+
' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_death()\n ^^^^^^^^^^^^^^^^^^^^^^\n',
485+
' File "<doctest default[0]>", line 7, in bright_side_of_death\n return tuple()[0]\n ^^^^^^^^^^\n']
481486
*** tb_lineno: 10
482487

483488

Include/cpython/traceback.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ typedef struct _traceback {
1010
int tb_lineno;
1111
} PyTracebackObject;
1212

13-
PyAPI_FUNC(int) _Py_DisplaySourceLine(PyObject *, PyObject *, int, int);
13+
PyAPI_FUNC(int) _Py_DisplaySourceLine(PyObject *, PyObject *, int, int, int *, PyObject **);
1414
PyAPI_FUNC(void) _PyTraceback_Add(const char *, const char *, int);

Lib/idlelib/idle_test/test_run.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ def __eq__(self, other):
3333
run.print_exception()
3434

3535
tb = output.getvalue().strip().splitlines()
36-
self.assertEqual(11, len(tb))
37-
self.assertIn('UnhashableException: ex2', tb[3])
38-
self.assertIn('UnhashableException: ex1', tb[10])
36+
self.assertEqual(13, len(tb))
37+
self.assertIn('UnhashableException: ex2', tb[4])
38+
self.assertIn('UnhashableException: ex1', tb[12])
3939

4040
data = (('1/0', ZeroDivisionError, "division by zero\n"),
4141
('abc', NameError, "name 'abc' is not defined. "

Lib/test/test_cmd_line_script.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -548,10 +548,10 @@ def test_pep_409_verbiage(self):
548548
script_name = _make_test_script(script_dir, 'script', script)
549549
exitcode, stdout, stderr = assert_python_failure(script_name)
550550
text = stderr.decode('ascii').split('\n')
551-
self.assertEqual(len(text), 5)
551+
self.assertEqual(len(text), 6)
552552
self.assertTrue(text[0].startswith('Traceback'))
553553
self.assertTrue(text[1].startswith(' File '))
554-
self.assertTrue(text[3].startswith('NameError'))
554+
self.assertTrue(text[4].startswith('NameError'))
555555

556556
def test_non_ascii(self):
557557
# Mac OS X denies the creation of a file with an invalid UTF-8 name.

Lib/test/test_doctest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2835,6 +2835,7 @@ def test_unicode(): """
28352835
exec(compile(example.source, filename, "single",
28362836
File "<doctest foo-bär@baz[0]>", line 1, in <module>
28372837
raise Exception('clé')
2838+
^^^^^^^^^^^^^^^^^^^^^^
28382839
Exception: clé
28392840
TestResults(failed=1, attempted=1)
28402841
"""

0 commit comments

Comments
 (0)