From: Florent Xicluna Date: Wed, 22 Jan 2014 00:33:59 +0000 (+0100) Subject: Issue #17825: Cursor ^ is correctly positioned for SyntaxError and IndentationError. X-Git-Tag: v2.7.8~100 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=edfd9addf6166cbc7406b95896d48cfdaf82adf7;p=thirdparty%2FPython%2Fcpython.git Issue #17825: Cursor ^ is correctly positioned for SyntaxError and IndentationError. --- diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 8076be8a785f..d7b183a09523 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 5ad2838fcfa5..0a3dd11df68d 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 26bd48543e26..35846b5a0a80 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