Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpo-46725: Document starred expressions in for statements #31481

Merged
merged 4 commits into from
Feb 22, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 13 additions & 8 deletions Doc/reference/compound_stmts.rst
Original file line number Diff line number Diff line change
Expand Up @@ -154,17 +154,20 @@ The :keyword:`for` statement is used to iterate over the elements of a sequence
(such as a string, tuple or list) or other iterable object:

.. productionlist:: python-grammar
for_stmt: "for" `target_list` "in" `expression_list` ":" `suite`
for_stmt: "for" `target_list` "in" `starred_list` ":" `suite`
: ["else" ":" `suite`]

The expression list is evaluated once; it should yield an iterable object. An
iterator is created for the result of the ``expression_list``. The suite is
then executed once for each item provided by the iterator, in the order returned
by the iterator. Each item in turn is assigned to the target list using the
standard rules for assignments (see :ref:`assignment`), and then the suite is
executed. When the items are exhausted (which is immediately when the sequence
is empty or an iterator raises a :exc:`StopIteration` exception), the suite in
the :keyword:`!else` clause, if present, is executed, and the loop terminates.
iterator is created for the result of the ``starred_list``. The expression
list can contain starred elements (``*x, *y``) that will be unpacked in the
final iterator (as when constructing a ``tuple`` or ``list`` literal). The
suite is then executed once for each item provided by the iterator, in the
order returned by the iterator. Each item in turn is assigned to the target
list using the standard rules for assignments (see :ref:`assignment`), and then
the suite is executed. When the items are exhausted (which is immediately when
the sequence is empty or an iterator raises a :exc:`StopIteration` exception),
the suite in the :keyword:`!else` clause, if present, is executed, and the loop
terminates.
pablogsal marked this conversation as resolved.
Show resolved Hide resolved

.. index::
statement: break
Expand Down Expand Up @@ -196,6 +199,8 @@ the built-in function :func:`range` returns an iterator of integers suitable to
emulate the effect of Pascal's ``for i := a to b do``; e.g., ``list(range(3))``
returns the list ``[0, 1, 2]``.

.. versionchanged:: 3.11
Starred elements are now allowed in the expression list.

.. _try:
.. _except:
Expand Down
3 changes: 3 additions & 0 deletions Doc/whatsnew/3.11.rst
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,9 @@ traceback. (Contributed by Irit Katriel in :issue:`45607`.)
Other Language Changes
======================

* Starred expressions can be used in :ref:`for statements<for>`. (See
:issue:`46725` for more details.)

* Asynchronous comprehensions are now allowed inside comprehensions in
asynchronous functions. Outer comprehensions implicitly become
asynchronous. (Contributed by Serhiy Storchaka in :issue:`33346`.)
Expand Down
6 changes: 6 additions & 0 deletions Lib/test/test_grammar.py
Original file line number Diff line number Diff line change
Expand Up @@ -1394,6 +1394,12 @@ def __getitem__(self, i):
result.append(x)
self.assertEqual(result, [1, 2, 3])

result = []
a = b = c = [1, 2, 3]
for x in *a, *b, *c:
result.append(x)
self.assertEqual(result, 3 * a)

def test_try(self):
### try_stmt: 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
### | 'try' ':' suite 'finally' ':' suite
Expand Down