[Python-checkins] bpo-40614: Respect feature version for f-string debug expressions (GH-20196) (GH-20466)

Shantanu webhook-mailer at python.org
Sat Jun 6 06:09:06 EDT 2020


https://github.com/python/cpython/commit/f7ed4d4e83f5d9e85e244a1cbc460f26436ab24d
commit: f7ed4d4e83f5d9e85e244a1cbc460f26436ab24d
branch: 3.8
author: Shantanu <hauntsaninja at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2020-06-06T11:08:48+01:00
summary:

bpo-40614: Respect feature version for f-string debug expressions (GH-20196) (GH-20466)

Co-authored-by: Lysandros Nikolaou <lisandrosnik at gmail.com>
Co-authored-by: Pablo Galindo <pablogsal at gmail.com>
(cherry picked from commit c116c94ff119485761460f1033cdee425bed0310)

files:
A Misc/NEWS.d/next/Library/2020-05-18-22-41-02.bpo-40614.8j3kmq.rst
M Lib/test/test_ast.py
M Python/ast.c

diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py
index 486f2aa707e83..869346664499c 100644
--- a/Lib/test/test_ast.py
+++ b/Lib/test/test_ast.py
@@ -630,6 +630,12 @@ def test_issue39579_dotted_name_end_col_offset(self):
         attr_b = tree.body[0].decorator_list[0].value
         self.assertEqual(attr_b.end_col_offset, 4)
 
+    def test_issue40614_feature_version(self):
+        ast.parse('f"{x=}"', feature_version=(3, 8))
+        with self.assertRaises(SyntaxError):
+            ast.parse('f"{x=}"', feature_version=(3, 7))
+
+
 class ASTHelpers_Test(unittest.TestCase):
     maxDiff = None
 
diff --git a/Misc/NEWS.d/next/Library/2020-05-18-22-41-02.bpo-40614.8j3kmq.rst b/Misc/NEWS.d/next/Library/2020-05-18-22-41-02.bpo-40614.8j3kmq.rst
new file mode 100644
index 0000000000000..238b98c14a326
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-05-18-22-41-02.bpo-40614.8j3kmq.rst
@@ -0,0 +1 @@
+:func:`ast.parse` will not parse self documenting expressions in f-strings when passed ``feature_version`` is less than ``(3, 8)``.
diff --git a/Python/ast.c b/Python/ast.c
index f70d48ba3a15d..594879bd0ef0b 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -5202,6 +5202,12 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl,
     /* Check for =, which puts the text value of the expression in
        expr_text. */
     if (**str == '=') {
+        if (c->c_feature_version < 8) {
+            ast_error(c, n,
+                      "f-string: self documenting expressions are "
+                      "only supported in Python 3.8 and greater");
+            goto error;
+        }
         *str += 1;
 
         /* Skip over ASCII whitespace.  No need to test for end of string



More information about the Python-checkins mailing list