mirror of
https://github.com/python/cpython.git
synced 2025-12-04 00:30:19 +00:00
bpo-43950: support some multi-line expressions for PEP 657 (GH-27339)
This is basically something that I noticed up while fixing test runs for another issue. It is really common to have multiline calls, and when they fail the display is kind of weird since we omit the annotations. E.g;
```
$ ./python t.py
Traceback (most recent call last):
File "/home/isidentical/cpython/cpython/t.py", line 11, in <module>
frame_1()
^^^^^^^^^
File "/home/isidentical/cpython/cpython/t.py", line 5, in frame_1
frame_2(
File "/home/isidentical/cpython/cpython/t.py", line 2, in frame_2
return a / 0 / b / c
~~^~~
ZeroDivisionError: division by zero
```
This patch basically adds support for annotating the rest of the line, if the instruction covers multiple lines (start_line != end_line).
Automerge-Triggered-By: GH:isidentical
This commit is contained in:
parent
96cf5a63d2
commit
3e235e0447
4 changed files with 63 additions and 17 deletions
|
|
@ -4,6 +4,7 @@ import collections
|
|||
import itertools
|
||||
import linecache
|
||||
import sys
|
||||
from contextlib import suppress
|
||||
|
||||
__all__ = ['extract_stack', 'extract_tb', 'format_exception',
|
||||
'format_exception_only', 'format_list', 'format_stack',
|
||||
|
|
@ -463,19 +464,20 @@ class StackSummary(list):
|
|||
|
||||
stripped_characters = len(frame._original_line) - len(frame.line.lstrip())
|
||||
if (
|
||||
frame.end_lineno == frame.lineno
|
||||
and frame.colno is not None
|
||||
frame.colno is not None
|
||||
and frame.end_colno is not None
|
||||
):
|
||||
colno = _byte_offset_to_character_offset(frame._original_line, frame.colno)
|
||||
end_colno = _byte_offset_to_character_offset(frame._original_line, frame.end_colno)
|
||||
|
||||
try:
|
||||
anchors = _extract_caret_anchors_from_line_segment(
|
||||
frame._original_line[colno - 1:end_colno - 1]
|
||||
)
|
||||
except Exception:
|
||||
anchors = None
|
||||
anchors = None
|
||||
if frame.lineno == frame.end_lineno:
|
||||
with suppress(Exception):
|
||||
anchors = _extract_caret_anchors_from_line_segment(
|
||||
frame._original_line[colno - 1:end_colno - 1]
|
||||
)
|
||||
else:
|
||||
end_colno = stripped_characters + len(frame.line.strip())
|
||||
|
||||
row.append(' ')
|
||||
row.append(' ' * (colno - stripped_characters))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue