Skip to content

Commit

Permalink
bpo-38964: Print correct filename on a SyntaxError in an fstring (pyt…
Browse files Browse the repository at this point in the history
…honGH-20399)

When a `SyntaxError` in the expression part of a fstring is found,
the filename attribute of the `SyntaxError` is always `<fstring>`.
With this commit, it gets changed to always have the name of the file
the fstring resides in.

Co-authored-by: Pablo Galindo <[email protected]>
  • Loading branch information
lysnikolaou and pablogsal authored May 26, 2020
1 parent 2602d97 commit f7b1e46
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 5 deletions.
13 changes: 13 additions & 0 deletions Lib/test/test_fstring.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@
# Unicode identifiers in tests is allowed by PEP 3131.

import ast
import os
import types
import decimal
import unittest
from test.support import temp_cwd, use_old_parser
from test.support.script_helper import assert_python_failure

a_global = 'global variable'

Expand Down Expand Up @@ -1044,6 +1047,16 @@ def test_errors(self):
r"f'{1000:j}'",
])

@unittest.skipIf(use_old_parser(), "The old parser only supports <fstring> as the filename")
def test_filename_in_syntaxerror(self):
# see issue 38964
with temp_cwd() as cwd:
file_path = os.path.join(cwd, 't.py')
with open(file_path, 'w') as f:
f.write('f"{a b}"') # This generates a SyntaxError
_, _, stderr = assert_python_failure(file_path)
self.assertIn(file_path, stderr.decode('utf-8'))

def test_loop(self):
for i in range(1000):
self.assertEqual(f'i:{i}', 'i:' + str(i))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
When there's a :exc:`SyntaxError` in the expression part of an fstring, the filename attribute of the :exc:`SyntaxError` gets correctly set to the name of the file the fstring resides in.
7 changes: 2 additions & 5 deletions Parser/pegen/parse_string.c
Original file line number Diff line number Diff line change
Expand Up @@ -606,11 +606,8 @@ fstring_compile_expr(Parser *p, const char *expr_start, const char *expr_end,
if (tok == NULL) {
return NULL;
}
tok->filename = PyUnicode_FromString("<fstring>");
if (!tok->filename) {
PyTokenizer_Free(tok);
return NULL;
}
Py_INCREF(p->tok->filename);
tok->filename = p->tok->filename;

Parser *p2 = _PyPegen_Parser_New(tok, Py_fstring_input, p->flags, p->feature_version,
NULL, p->arena);
Expand Down

0 comments on commit f7b1e46

Please sign in to comment.