https://github.com/python/cpython/commit/b1f893875bbbb37bdbc440886d464690999f6e3a
commit: b1f893875bbbb37bdbc440886d464690999f6e3a
branch: main
author: sobolevn <[email protected]>
committer: sobolevn <[email protected]>
date: 2025-04-30T13:39:26+03:00
summary:
gh-133194: Add `CHECK_VERSION` to new PEP758 grammar (#133195)
files:
A
Misc/NEWS.d/next/Core_and_Builtins/2025-04-30-13-09-20.gh-issue-133194.25_G5c.rst
M Grammar/python.gram
M Lib/test/test_ast/test_ast.py
M Parser/parser.c
diff --git a/Grammar/python.gram b/Grammar/python.gram
index 940063e5c7ba1e..fc9912fd57313b 100644
--- a/Grammar/python.gram
+++ b/Grammar/python.gram
@@ -442,7 +442,11 @@ try_stmt[stmt_ty]:
except_block[excepthandler_ty]:
| invalid_except_stmt_indent
| 'except' e=expressions ':' b=block {
- _PyAST_ExceptHandler(e, NULL, b, EXTRA) }
+ CHECK_VERSION(
+ excepthandler_ty,
+ 14,
+ "except expressions without parentheses",
+ _PyAST_ExceptHandler(e, NULL, b, EXTRA)) }
| 'except' e=expression 'as' t=NAME ':' b=block {
_PyAST_ExceptHandler(e, ((expr_ty) t)->v.Name.id, b, EXTRA) }
| 'except' ':' b=block { _PyAST_ExceptHandler(NULL, NULL, b, EXTRA) }
@@ -450,7 +454,11 @@ except_block[excepthandler_ty]:
except_star_block[excepthandler_ty]:
| invalid_except_star_stmt_indent
| 'except' '*' e=expressions ':' b=block {
- _PyAST_ExceptHandler(e, NULL, b, EXTRA) }
+ CHECK_VERSION(
+ excepthandler_ty,
+ 14,
+ "except expressions without parentheses",
+ _PyAST_ExceptHandler(e, NULL, b, EXTRA)) }
| 'except' '*' e=expression 'as' t=NAME ':' b=block {
_PyAST_ExceptHandler(e, ((expr_ty) t)->v.Name.id, b, EXTRA) }
| invalid_except_star_stmt
diff --git a/Lib/test/test_ast/test_ast.py b/Lib/test/test_ast/test_ast.py
index eeac7c21eda98f..2a1b47345abd39 100644
--- a/Lib/test/test_ast/test_ast.py
+++ b/Lib/test/test_ast/test_ast.py
@@ -675,6 +675,28 @@ def test_assignment_expression_feature_version(self):
with self.assertRaises(SyntaxError):
ast.parse('(x := 0)', feature_version=(3, 7))
+ def test_pep758_except_without_parens(self):
+ code = textwrap.dedent("""
+ try:
+ ...
+ except ValueError, TypeError:
+ ...
+ """)
+ ast.parse(code, feature_version=(3, 14))
+ with self.assertRaises(SyntaxError):
+ ast.parse(code, feature_version=(3, 13))
+
+ def test_pep758_except_star_without_parens(self):
+ code = textwrap.dedent("""
+ try:
+ ...
+ except* ValueError, TypeError:
+ ...
+ """)
+ ast.parse(code, feature_version=(3, 14))
+ with self.assertRaises(SyntaxError):
+ ast.parse(code, feature_version=(3, 13))
+
def test_conditional_context_managers_parse_with_low_feature_version(self):
# regression test for gh-115881
ast.parse('with (x() if y else z()): ...', feature_version=(3, 8))
diff --git
a/Misc/NEWS.d/next/Core_and_Builtins/2025-04-30-13-09-20.gh-issue-133194.25_G5c.rst
b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-30-13-09-20.gh-issue-133194.25_G5c.rst
new file mode 100644
index 00000000000000..fa597db114cd4c
--- /dev/null
+++
b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-30-13-09-20.gh-issue-133194.25_G5c.rst
@@ -0,0 +1,2 @@
+:func:`ast.parse` will no longer parse new :pep:`758` syntax with older
+*feature_version* passed.
diff --git a/Parser/parser.c b/Parser/parser.c
index ff5d8baf9204b6..03eda566f02226 100644
--- a/Parser/parser.c
+++ b/Parser/parser.c
@@ -7140,7 +7140,7 @@ except_block_rule(Parser *p)
UNUSED(_end_lineno); // Only used by EXTRA macro
int _end_col_offset = _token->end_col_offset;
UNUSED(_end_col_offset); // Only used by EXTRA macro
- _res = _PyAST_ExceptHandler ( e , NULL , b , EXTRA );
+ _res = CHECK_VERSION ( excepthandler_ty , 14 , "except expressions
without parentheses" , _PyAST_ExceptHandler ( e , NULL , b , EXTRA ) );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
p->level--;
@@ -7342,7 +7342,7 @@ except_star_block_rule(Parser *p)
UNUSED(_end_lineno); // Only used by EXTRA macro
int _end_col_offset = _token->end_col_offset;
UNUSED(_end_col_offset); // Only used by EXTRA macro
- _res = _PyAST_ExceptHandler ( e , NULL , b , EXTRA );
+ _res = CHECK_VERSION ( excepthandler_ty , 14 , "except expressions
without parentheses" , _PyAST_ExceptHandler ( e , NULL , b , EXTRA ) );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
p->level--;
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]