From 6f4976a7ace2fb5c6a5df57c4cb7dcf65eff44c9 Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Sat, 5 Mar 2022 04:37:16 +0300 Subject: [PATCH] Allow `for`'s target expression to be starred (#2879) Fixes #2878 --- CHANGES.md | 3 ++- src/blib2to3/Grammar.txt | 2 +- tests/data/starred_for_target.py | 27 +++++++++++++++++++++++++++ tests/test_format.py | 1 + 4 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 tests/data/starred_for_target.py diff --git a/CHANGES.md b/CHANGES.md index a0b87c78015..ac9212e9940 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -50,7 +50,8 @@ ### Parser - +- Black can now parse starred expressions in the target of `for` and `async for` + statements, e.g `for item in *items_1, *items_2: pass` (#2879). ### Performance diff --git a/src/blib2to3/Grammar.txt b/src/blib2to3/Grammar.txt index cf4799f8abe..0ce6cf39111 100644 --- a/src/blib2to3/Grammar.txt +++ b/src/blib2to3/Grammar.txt @@ -109,7 +109,7 @@ compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef async_stmt: ASYNC (funcdef | with_stmt | for_stmt) if_stmt: 'if' namedexpr_test ':' suite ('elif' namedexpr_test ':' suite)* ['else' ':' suite] while_stmt: 'while' namedexpr_test ':' suite ['else' ':' suite] -for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] +for_stmt: 'for' exprlist 'in' testlist_star_expr ':' suite ['else' ':' suite] try_stmt: ('try' ':' suite ((except_clause ':' suite)+ ['else' ':' suite] diff --git a/tests/data/starred_for_target.py b/tests/data/starred_for_target.py new file mode 100644 index 00000000000..8fc8e059ed3 --- /dev/null +++ b/tests/data/starred_for_target.py @@ -0,0 +1,27 @@ +for x in *a, *b: + print(x) + +for x in a, b, *c: + print(x) + +for x in *a, b, c: + print(x) + +for x in *a, b, *c: + print(x) + +async for x in *a, *b: + print(x) + +async for x in *a, b, *c: + print(x) + +async for x in a, b, *c: + print(x) + +async for x in ( + *loooooooooooooooooooooong, + very, + *loooooooooooooooooooooooooooooooooooooooooooooooong, +): + print(x) diff --git a/tests/test_format.py b/tests/test_format.py index 04676c1c2c5..04eda43d5cf 100644 --- a/tests/test_format.py +++ b/tests/test_format.py @@ -62,6 +62,7 @@ ] PY310_CASES: List[str] = [ + "starred_for_target", "pattern_matching_simple", "pattern_matching_complex", "pattern_matching_extras",