summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorent Xicluna <florent.xicluna@gmail.com>2014-01-22 00:33:59 (GMT)
committerFlorent Xicluna <florent.xicluna@gmail.com>2014-01-22 00:33:59 (GMT)
commitedfd9addf6166cbc7406b95896d48cfdaf82adf7 (patch)
tree02f085b06c364cb78a48988345860d435ad8534b
parent70df667dfeb6b8600f3f0d34dfbf7a57d5205046 (diff)
downloadcpython-edfd9addf6166cbc7406b95896d48cfdaf82adf7.zip
cpython-edfd9addf6166cbc7406b95896d48cfdaf82adf7.tar.gz
cpython-edfd9addf6166cbc7406b95896d48cfdaf82adf7.tar.bz2
Issue #17825: Cursor ^ is correctly positioned for SyntaxError and IndentationError.
-rw-r--r--Lib/test/test_traceback.py10
-rw-r--r--Lib/traceback.py7
-rw-r--r--Misc/NEWS3
3 files changed, 17 insertions, 3 deletions
diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py
index 8076be8..d7b183a 100644
--- a/Lib/test/test_traceback.py
+++ b/Lib/test/test_traceback.py
@@ -35,6 +35,9 @@ class TracebackCases(unittest.TestCase):
def syntax_error_bad_indentation(self):
compile("def spam():\n print 1\n print 2", "?", "exec")
+ def syntax_error_bad_indentation2(self):
+ compile(" print(2)", "?", "exec")
+
def test_caret(self):
err = self.get_exception_format(self.syntax_error_with_caret,
SyntaxError)
@@ -111,6 +114,13 @@ def test():
os.unlink(os.path.join(testdir, f))
os.rmdir(testdir)
+ err = self.get_exception_format(self.syntax_error_bad_indentation2,
+ IndentationError)
+ self.assertEqual(len(err), 4)
+ self.assertEqual(err[1].strip(), "print(2)")
+ self.assertIn("^", err[2])
+ self.assertEqual(err[1].find("p"), err[2].find("^"))
+
def test_base_exception(self):
# Test that exceptions derived from BaseException are formatted right
e = KeyboardInterrupt()
diff --git a/Lib/traceback.py b/Lib/traceback.py
index 5ad2838..0a3dd11 100644
--- a/Lib/traceback.py
+++ b/Lib/traceback.py
@@ -189,11 +189,12 @@ def format_exception_only(etype, value):
if badline is not None:
lines.append(' %s\n' % badline.strip())
if offset is not None:
- caretspace = badline.rstrip('\n')[:offset].lstrip()
+ caretspace = badline.rstrip('\n')
+ offset = min(len(caretspace), offset) - 1
+ caretspace = caretspace[:offset].lstrip()
# non-space whitespace (likes tabs) must be kept for alignment
caretspace = ((c.isspace() and c or ' ') for c in caretspace)
- # only three spaces to account for offset1 == pos 0
- lines.append(' %s^\n' % ''.join(caretspace))
+ lines.append(' %s^\n' % ''.join(caretspace))
value = msg
lines.append(_format_final_exc_line(stype, value))
diff --git a/Misc/NEWS b/Misc/NEWS
index 26bd485..35846b5 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -9,6 +9,9 @@ What's New in Python 2.7.7?
Core and Builtins
-----------------
+- Issue #17825: Cursor "^" is correctly positioned for SyntaxError and
+ IndentationError.
+
- Issue #19081: When a zipimport .zip file in sys.path being imported from
is modified during the lifetime of the Python process after zipimport has
already cached the zip's table of contents we detect this and recover