Skip to content

Commit 2ea320d

Browse files
authored
bpo-40631: Disallow single parenthesized star target (GH-24027)
1 parent 8f8de73 commit 2ea320d

File tree

4 files changed

+823
-544
lines changed

4 files changed

+823
-544
lines changed

Grammar/python.gram

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -580,18 +580,23 @@ star_targets[expr_ty]:
580580
| a=star_target !',' { a }
581581
| a=star_target b=(',' c=star_target { c })* [','] {
582582
_Py_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Store, EXTRA) }
583-
star_targets_seq[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_target+ [','] { a }
583+
star_targets_list_seq[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_target+ [','] { a }
584+
star_targets_tuple_seq[asdl_expr_seq*]:
585+
| a=star_target b=(',' c=star_target { c })+ [','] { (asdl_expr_seq*) _PyPegen_seq_insert_in_front(p, a, b) }
586+
| a=star_target ',' { (asdl_expr_seq*) _PyPegen_singleton_seq(p, a) }
584587
star_target[expr_ty] (memo):
585588
| '*' a=(!'*' star_target) {
586589
_Py_Starred(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), Store, EXTRA) }
590+
| target_with_star_atom
591+
target_with_star_atom[expr_ty] (memo):
587592
| a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Store, EXTRA) }
588593
| a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Store, EXTRA) }
589594
| star_atom
590595
star_atom[expr_ty]:
591596
| a=NAME { _PyPegen_set_expr_context(p, a, Store) }
592-
| '(' a=star_target ')' { _PyPegen_set_expr_context(p, a, Store) }
593-
| '(' a=[star_targets_seq] ')' { _Py_Tuple(a, Store, EXTRA) }
594-
| '[' a=[star_targets_seq] ']' { _Py_List(a, Store, EXTRA) }
597+
| '(' a=target_with_star_atom ')' { _PyPegen_set_expr_context(p, a, Store) }
598+
| '(' a=[star_targets_tuple_seq] ')' { _Py_Tuple(a, Store, EXTRA) }
599+
| '[' a=[star_targets_list_seq] ']' { _Py_List(a, Store, EXTRA) }
595600

596601
single_target[expr_ty]:
597602
| single_subscript_attribute_target

Lib/test/test_unpack_ex.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,31 @@
346346
...
347347
SyntaxError: can't use starred expression here
348348
349+
>>> (*x),y = 1, 2 # doctest:+ELLIPSIS
350+
Traceback (most recent call last):
351+
...
352+
SyntaxError: can't use starred expression here
353+
354+
>>> (((*x))),y = 1, 2 # doctest:+ELLIPSIS
355+
Traceback (most recent call last):
356+
...
357+
SyntaxError: can't use starred expression here
358+
359+
>>> z,(*x),y = 1, 2, 4 # doctest:+ELLIPSIS
360+
Traceback (most recent call last):
361+
...
362+
SyntaxError: can't use starred expression here
363+
364+
>>> z,(*x) = 1, 2 # doctest:+ELLIPSIS
365+
Traceback (most recent call last):
366+
...
367+
SyntaxError: can't use starred expression here
368+
369+
>>> ((*x),y) = 1, 2 # doctest:+ELLIPSIS
370+
Traceback (most recent call last):
371+
...
372+
SyntaxError: can't use starred expression here
373+
349374
Some size constraints (all fail.)
350375
351376
>>> s = ", ".join("a%d" % i for i in range(1<<8)) + ", *rest = range(1<<8 + 1)"
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix regression where a single parenthesized starred expression was a valid
2+
assignment target.

0 commit comments

Comments
 (0)