[Python-checkins] bpo-40614: Respect feature version for f-string debug expressions (GH-20196)
Shantanu
webhook-mailer at python.org
Wed May 27 16:30:46 EDT 2020
https://github.com/python/cpython/commit/c116c94ff119485761460f1033cdee425bed0310
commit: c116c94ff119485761460f1033cdee425bed0310
branch: master
author: Shantanu <hauntsaninja at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2020-05-27T21:30:38+01:00
summary:
bpo-40614: Respect feature version for f-string debug expressions (GH-20196)
Co-authored-by: Lysandros Nikolaou <lisandrosnik at gmail.com>
Co-authored-by: Pablo Galindo <pablogsal at gmail.com>
files:
A Misc/NEWS.d/next/Library/2020-05-18-22-41-02.bpo-40614.8j3kmq.rst
M Lib/test/test_ast.py
M Parser/pegen/parse_string.c
M Python/ast.c
diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py
index 3e9c8b55cdff4..a3b366ec35da1 100644
--- a/Lib/test/test_ast.py
+++ b/Lib/test/test_ast.py
@@ -663,6 +663,11 @@ def test_ast_asdl_signature(self):
expressions[0] = f"expr = {ast.expr.__subclasses__()[0].__doc__}"
self.assertCountEqual(ast.expr.__doc__.split("\n"), expressions)
+ 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/Parser/pegen/parse_string.c b/Parser/pegen/parse_string.c
index a0ec698fa56a2..e24ecc58d3aa1 100644
--- a/Parser/pegen/parse_string.c
+++ b/Parser/pegen/parse_string.c
@@ -928,6 +928,11 @@ fstring_find_expr(Parser *p, const char **str, const char *end, int raw, int rec
/* Check for =, which puts the text value of the expression in
expr_text. */
if (**str == '=') {
+ if (p->feature_version < 8) {
+ RAISE_SYNTAX_ERROR("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
diff --git a/Python/ast.c b/Python/ast.c
index 2d20ca62aa837..c524b8e34e873 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -5069,6 +5069,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