From f7b1e461567e5e3fa3ba46f589d9edc1b45b2dd0 Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Tue, 26 May 2020 03:32:18 +0300 Subject: bpo-38964: Print correct filename on a SyntaxError in an fstring (GH-20399) When a `SyntaxError` in the expression part of a fstring is found, the filename attribute of the `SyntaxError` is always ``. With this commit, it gets changed to always have the name of the file the fstring resides in. Co-authored-by: Pablo Galindo --- Lib/test/test_fstring.py | 13 +++++++++++++ .../2020-05-25-21-49-11.bpo-38964.lrml90.rst | 1 + Parser/pegen/parse_string.c | 7 ++----- 3 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-25-21-49-11.bpo-38964.lrml90.rst diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index e0bb5b5..ea4e589 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -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' @@ -1044,6 +1047,16 @@ non-important content r"f'{1000:j}'", ]) + @unittest.skipIf(use_old_parser(), "The old parser only supports 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)) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-25-21-49-11.bpo-38964.lrml90.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-25-21-49-11.bpo-38964.lrml90.rst new file mode 100644 index 0000000..1200764 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-05-25-21-49-11.bpo-38964.lrml90.rst @@ -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. \ No newline at end of file diff --git a/Parser/pegen/parse_string.c b/Parser/pegen/parse_string.c index ca4b733..a0ec698 100644 --- a/Parser/pegen/parse_string.c +++ b/Parser/pegen/parse_string.c @@ -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(""); - 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); -- cgit v0.12