17db96d56Sopenharmony_ci.. _compound:
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci*******************
47db96d56Sopenharmony_ciCompound statements
57db96d56Sopenharmony_ci*******************
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci.. index:: pair: compound; statement
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ciCompound statements contain (groups of) other statements; they affect or control
107db96d56Sopenharmony_cithe execution of those other statements in some way.  In general, compound
117db96d56Sopenharmony_cistatements span multiple lines, although in simple incarnations a whole compound
127db96d56Sopenharmony_cistatement may be contained in one line.
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ciThe :keyword:`if`, :keyword:`while` and :keyword:`for` statements implement
157db96d56Sopenharmony_citraditional control flow constructs.  :keyword:`try` specifies exception
167db96d56Sopenharmony_cihandlers and/or cleanup code for a group of statements, while the
177db96d56Sopenharmony_ci:keyword:`with` statement allows the execution of initialization and
187db96d56Sopenharmony_cifinalization code around a block of code.  Function and class definitions are
197db96d56Sopenharmony_cialso syntactically compound statements.
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci.. index::
227db96d56Sopenharmony_ci   single: clause
237db96d56Sopenharmony_ci   single: suite
247db96d56Sopenharmony_ci   single: ; (semicolon)
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ciA compound statement consists of one or more 'clauses.'  A clause consists of a
277db96d56Sopenharmony_ciheader and a 'suite.'  The clause headers of a particular compound statement are
287db96d56Sopenharmony_ciall at the same indentation level. Each clause header begins with a uniquely
297db96d56Sopenharmony_ciidentifying keyword and ends with a colon.  A suite is a group of statements
307db96d56Sopenharmony_cicontrolled by a clause.  A suite can be one or more semicolon-separated simple
317db96d56Sopenharmony_cistatements on the same line as the header, following the header's colon, or it
327db96d56Sopenharmony_cican be one or more indented statements on subsequent lines.  Only the latter
337db96d56Sopenharmony_ciform of a suite can contain nested compound statements; the following is illegal,
347db96d56Sopenharmony_cimostly because it wouldn't be clear to which :keyword:`if` clause a following
357db96d56Sopenharmony_ci:keyword:`else` clause would belong::
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci   if test1: if test2: print(x)
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ciAlso note that the semicolon binds tighter than the colon in this context, so
407db96d56Sopenharmony_cithat in the following example, either all or none of the :func:`print` calls are
417db96d56Sopenharmony_ciexecuted::
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci   if x < y < z: print(x); print(y); print(z)
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ciSummarizing:
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci.. productionlist:: python-grammar
497db96d56Sopenharmony_ci   compound_stmt: `if_stmt`
507db96d56Sopenharmony_ci                : | `while_stmt`
517db96d56Sopenharmony_ci                : | `for_stmt`
527db96d56Sopenharmony_ci                : | `try_stmt`
537db96d56Sopenharmony_ci                : | `with_stmt`
547db96d56Sopenharmony_ci                : | `match_stmt`
557db96d56Sopenharmony_ci                : | `funcdef`
567db96d56Sopenharmony_ci                : | `classdef`
577db96d56Sopenharmony_ci                : | `async_with_stmt`
587db96d56Sopenharmony_ci                : | `async_for_stmt`
597db96d56Sopenharmony_ci                : | `async_funcdef`
607db96d56Sopenharmony_ci   suite: `stmt_list` NEWLINE | NEWLINE INDENT `statement`+ DEDENT
617db96d56Sopenharmony_ci   statement: `stmt_list` NEWLINE | `compound_stmt`
627db96d56Sopenharmony_ci   stmt_list: `simple_stmt` (";" `simple_stmt`)* [";"]
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci.. index::
657db96d56Sopenharmony_ci   single: NEWLINE token
667db96d56Sopenharmony_ci   single: DEDENT token
677db96d56Sopenharmony_ci   pair: dangling; else
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ciNote that statements always end in a ``NEWLINE`` possibly followed by a
707db96d56Sopenharmony_ci``DEDENT``.  Also note that optional continuation clauses always begin with a
717db96d56Sopenharmony_cikeyword that cannot start a statement, thus there are no ambiguities (the
727db96d56Sopenharmony_ci'dangling :keyword:`else`' problem is solved in Python by requiring nested
737db96d56Sopenharmony_ci:keyword:`if` statements to be indented).
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ciThe formatting of the grammar rules in the following sections places each clause
767db96d56Sopenharmony_cion a separate line for clarity.
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci.. _if:
807db96d56Sopenharmony_ci.. _elif:
817db96d56Sopenharmony_ci.. _else:
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ciThe :keyword:`!if` statement
847db96d56Sopenharmony_ci============================
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci.. index::
877db96d56Sopenharmony_ci   ! pair: statement; if
887db96d56Sopenharmony_ci   pair: keyword; elif
897db96d56Sopenharmony_ci   pair: keyword; else
907db96d56Sopenharmony_ci   single: : (colon); compound statement
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ciThe :keyword:`if` statement is used for conditional execution:
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci.. productionlist:: python-grammar
957db96d56Sopenharmony_ci   if_stmt: "if" `assignment_expression` ":" `suite`
967db96d56Sopenharmony_ci          : ("elif" `assignment_expression` ":" `suite`)*
977db96d56Sopenharmony_ci          : ["else" ":" `suite`]
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ciIt selects exactly one of the suites by evaluating the expressions one by one
1007db96d56Sopenharmony_ciuntil one is found to be true (see section :ref:`booleans` for the definition of
1017db96d56Sopenharmony_citrue and false); then that suite is executed (and no other part of the
1027db96d56Sopenharmony_ci:keyword:`if` statement is executed or evaluated).  If all expressions are
1037db96d56Sopenharmony_cifalse, the suite of the :keyword:`else` clause, if present, is executed.
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci.. _while:
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ciThe :keyword:`!while` statement
1097db96d56Sopenharmony_ci===============================
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci.. index::
1127db96d56Sopenharmony_ci   ! pair: statement; while
1137db96d56Sopenharmony_ci   pair: keyword; else
1147db96d56Sopenharmony_ci   pair: loop; statement
1157db96d56Sopenharmony_ci   single: : (colon); compound statement
1167db96d56Sopenharmony_ci
1177db96d56Sopenharmony_ciThe :keyword:`while` statement is used for repeated execution as long as an
1187db96d56Sopenharmony_ciexpression is true:
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci.. productionlist:: python-grammar
1217db96d56Sopenharmony_ci   while_stmt: "while" `assignment_expression` ":" `suite`
1227db96d56Sopenharmony_ci             : ["else" ":" `suite`]
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ciThis repeatedly tests the expression and, if it is true, executes the first
1257db96d56Sopenharmony_cisuite; if the expression is false (which may be the first time it is tested) the
1267db96d56Sopenharmony_cisuite of the :keyword:`!else` clause, if present, is executed and the loop
1277db96d56Sopenharmony_citerminates.
1287db96d56Sopenharmony_ci
1297db96d56Sopenharmony_ci.. index::
1307db96d56Sopenharmony_ci   pair: statement; break
1317db96d56Sopenharmony_ci   pair: statement; continue
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ciA :keyword:`break` statement executed in the first suite terminates the loop
1347db96d56Sopenharmony_ciwithout executing the :keyword:`!else` clause's suite.  A :keyword:`continue`
1357db96d56Sopenharmony_cistatement executed in the first suite skips the rest of the suite and goes back
1367db96d56Sopenharmony_cito testing the expression.
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ci.. _for:
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ciThe :keyword:`!for` statement
1427db96d56Sopenharmony_ci=============================
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci.. index::
1457db96d56Sopenharmony_ci   ! pair: statement; for
1467db96d56Sopenharmony_ci   pair: keyword; in
1477db96d56Sopenharmony_ci   pair: keyword; else
1487db96d56Sopenharmony_ci   pair: target; list
1497db96d56Sopenharmony_ci   pair: loop; statement
1507db96d56Sopenharmony_ci   pair: object; sequence
1517db96d56Sopenharmony_ci   single: : (colon); compound statement
1527db96d56Sopenharmony_ci
1537db96d56Sopenharmony_ciThe :keyword:`for` statement is used to iterate over the elements of a sequence
1547db96d56Sopenharmony_ci(such as a string, tuple or list) or other iterable object:
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci.. productionlist:: python-grammar
1577db96d56Sopenharmony_ci   for_stmt: "for" `target_list` "in" `starred_list` ":" `suite`
1587db96d56Sopenharmony_ci           : ["else" ":" `suite`]
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ciThe ``starred_list`` expression is evaluated once; it should yield an
1617db96d56Sopenharmony_ci:term:`iterable` object.  An :term:`iterator` is created for that iterable.
1627db96d56Sopenharmony_ciThe first item provided
1637db96d56Sopenharmony_ciby the iterator is then assigned to the target list using the standard
1647db96d56Sopenharmony_cirules for assignments (see :ref:`assignment`), and the suite is executed.  This
1657db96d56Sopenharmony_cirepeats for each item provided by the iterator.  When the iterator is exhausted,
1667db96d56Sopenharmony_cithe suite in the :keyword:`!else` clause,
1677db96d56Sopenharmony_ciif present, is executed, and the loop terminates.
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci.. index::
1707db96d56Sopenharmony_ci   pair: statement; break
1717db96d56Sopenharmony_ci   pair: statement; continue
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ciA :keyword:`break` statement executed in the first suite terminates the loop
1747db96d56Sopenharmony_ciwithout executing the :keyword:`!else` clause's suite.  A :keyword:`continue`
1757db96d56Sopenharmony_cistatement executed in the first suite skips the rest of the suite and continues
1767db96d56Sopenharmony_ciwith the next item, or with the :keyword:`!else` clause if there is no next
1777db96d56Sopenharmony_ciitem.
1787db96d56Sopenharmony_ci
1797db96d56Sopenharmony_ciThe for-loop makes assignments to the variables in the target list.
1807db96d56Sopenharmony_ciThis overwrites all previous assignments to those variables including
1817db96d56Sopenharmony_cithose made in the suite of the for-loop::
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ci   for i in range(10):
1847db96d56Sopenharmony_ci       print(i)
1857db96d56Sopenharmony_ci       i = 5             # this will not affect the for-loop
1867db96d56Sopenharmony_ci                         # because i will be overwritten with the next
1877db96d56Sopenharmony_ci                         # index in the range
1887db96d56Sopenharmony_ci
1897db96d56Sopenharmony_ci
1907db96d56Sopenharmony_ci.. index::
1917db96d56Sopenharmony_ci   pair: built-in function; range
1927db96d56Sopenharmony_ci
1937db96d56Sopenharmony_ciNames in the target list are not deleted when the loop is finished, but if the
1947db96d56Sopenharmony_cisequence is empty, they will not have been assigned to at all by the loop.  Hint:
1957db96d56Sopenharmony_cithe built-in type :func:`range` represents immutable arithmetic sequences of integers.
1967db96d56Sopenharmony_ciFor instance, iterating ``range(3)`` successively yields 0, 1, and then 2.
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci.. versionchanged:: 3.11
1997db96d56Sopenharmony_ci   Starred elements are now allowed in the expression list.
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci.. _try:
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ciThe :keyword:`!try` statement
2057db96d56Sopenharmony_ci=============================
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ci.. index::
2087db96d56Sopenharmony_ci   ! pair: statement; try
2097db96d56Sopenharmony_ci   pair: keyword; except
2107db96d56Sopenharmony_ci   pair: keyword; finally
2117db96d56Sopenharmony_ci   pair: keyword; else
2127db96d56Sopenharmony_ci   pair: keyword; as
2137db96d56Sopenharmony_ci   single: : (colon); compound statement
2147db96d56Sopenharmony_ci
2157db96d56Sopenharmony_ciThe :keyword:`!try` statement specifies exception handlers and/or cleanup code
2167db96d56Sopenharmony_cifor a group of statements:
2177db96d56Sopenharmony_ci
2187db96d56Sopenharmony_ci.. productionlist:: python-grammar
2197db96d56Sopenharmony_ci   try_stmt: `try1_stmt` | `try2_stmt` | `try3_stmt`
2207db96d56Sopenharmony_ci   try1_stmt: "try" ":" `suite`
2217db96d56Sopenharmony_ci            : ("except" [`expression` ["as" `identifier`]] ":" `suite`)+
2227db96d56Sopenharmony_ci            : ["else" ":" `suite`]
2237db96d56Sopenharmony_ci            : ["finally" ":" `suite`]
2247db96d56Sopenharmony_ci   try2_stmt: "try" ":" `suite`
2257db96d56Sopenharmony_ci            : ("except" "*" `expression` ["as" `identifier`] ":" `suite`)+
2267db96d56Sopenharmony_ci            : ["else" ":" `suite`]
2277db96d56Sopenharmony_ci            : ["finally" ":" `suite`]
2287db96d56Sopenharmony_ci   try3_stmt: "try" ":" `suite`
2297db96d56Sopenharmony_ci            : "finally" ":" `suite`
2307db96d56Sopenharmony_ci
2317db96d56Sopenharmony_ciAdditional information on exceptions can be found in section :ref:`exceptions`,
2327db96d56Sopenharmony_ciand information on using the :keyword:`raise` statement to generate exceptions
2337db96d56Sopenharmony_cimay be found in section :ref:`raise`.
2347db96d56Sopenharmony_ci
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci.. _except:
2377db96d56Sopenharmony_ci
2387db96d56Sopenharmony_ci:keyword:`!except` clause
2397db96d56Sopenharmony_ci-------------------------
2407db96d56Sopenharmony_ci
2417db96d56Sopenharmony_ciThe :keyword:`!except` clause(s) specify one or more exception handlers. When no
2427db96d56Sopenharmony_ciexception occurs in the :keyword:`try` clause, no exception handler is executed.
2437db96d56Sopenharmony_ciWhen an exception occurs in the :keyword:`!try` suite, a search for an exception
2447db96d56Sopenharmony_cihandler is started. This search inspects the :keyword:`!except` clauses in turn
2457db96d56Sopenharmony_ciuntil one is found that matches the exception.
2467db96d56Sopenharmony_ciAn expression-less :keyword:`!except` clause, if present, must be last;
2477db96d56Sopenharmony_ciit matches any exception.
2487db96d56Sopenharmony_ciFor an :keyword:`!except` clause with an expression,
2497db96d56Sopenharmony_cithat expression is evaluated, and the clause matches the exception
2507db96d56Sopenharmony_ciif the resulting object is "compatible" with the exception.  An object is
2517db96d56Sopenharmony_cicompatible with an exception if the object is the class or a
2527db96d56Sopenharmony_ci:term:`non-virtual base class <abstract base class>` of the exception object,
2537db96d56Sopenharmony_cior a tuple containing an item that is the class or a non-virtual base class
2547db96d56Sopenharmony_ciof the exception object.
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ciIf no :keyword:`!except` clause matches the exception,
2577db96d56Sopenharmony_cithe search for an exception handler
2587db96d56Sopenharmony_cicontinues in the surrounding code and on the invocation stack.  [#]_
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ciIf the evaluation of an expression
2617db96d56Sopenharmony_ciin the header of an :keyword:`!except` clause raises an exception,
2627db96d56Sopenharmony_cithe original search for a handler is canceled and a search starts for
2637db96d56Sopenharmony_cithe new exception in the surrounding code and on the call stack (it is treated
2647db96d56Sopenharmony_cias if the entire :keyword:`try` statement raised the exception).
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ci.. index:: single: as; except clause
2677db96d56Sopenharmony_ci
2687db96d56Sopenharmony_ciWhen a matching :keyword:`!except` clause is found,
2697db96d56Sopenharmony_cithe exception is assigned to the target
2707db96d56Sopenharmony_cispecified after the :keyword:`!as` keyword in that :keyword:`!except` clause,
2717db96d56Sopenharmony_ciif present, and the :keyword:`!except` clause's suite is executed.
2727db96d56Sopenharmony_ciAll :keyword:`!except` clauses must have an executable block.
2737db96d56Sopenharmony_ciWhen the end of this block is reached, execution continues
2747db96d56Sopenharmony_cinormally after the entire :keyword:`try` statement.
2757db96d56Sopenharmony_ci(This means that if two nested handlers exist for the same exception,
2767db96d56Sopenharmony_ciand the exception occurs in the :keyword:`!try` clause of the inner handler,
2777db96d56Sopenharmony_cithe outer handler will not handle the exception.)
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ciWhen an exception has been assigned using ``as target``, it is cleared at the
2807db96d56Sopenharmony_ciend of the :keyword:`!except` clause.  This is as if ::
2817db96d56Sopenharmony_ci
2827db96d56Sopenharmony_ci   except E as N:
2837db96d56Sopenharmony_ci       foo
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ciwas translated to ::
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_ci   except E as N:
2887db96d56Sopenharmony_ci       try:
2897db96d56Sopenharmony_ci           foo
2907db96d56Sopenharmony_ci       finally:
2917db96d56Sopenharmony_ci           del N
2927db96d56Sopenharmony_ci
2937db96d56Sopenharmony_ciThis means the exception must be assigned to a different name to be able to
2947db96d56Sopenharmony_cirefer to it after the :keyword:`!except` clause.
2957db96d56Sopenharmony_ciExceptions are cleared because with the
2967db96d56Sopenharmony_citraceback attached to them, they form a reference cycle with the stack frame,
2977db96d56Sopenharmony_cikeeping all locals in that frame alive until the next garbage collection occurs.
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci.. index::
3007db96d56Sopenharmony_ci   pair: module; sys
3017db96d56Sopenharmony_ci   pair: object; traceback
3027db96d56Sopenharmony_ci
3037db96d56Sopenharmony_ciBefore an :keyword:`!except` clause's suite is executed,
3047db96d56Sopenharmony_cithe exception is stored in the :mod:`sys` module, where it can be accessed
3057db96d56Sopenharmony_cifrom within the body of the :keyword:`!except` clause by calling
3067db96d56Sopenharmony_ci:func:`sys.exception`. When leaving an exception handler, the exception
3077db96d56Sopenharmony_cistored in the :mod:`sys` module is reset to its previous value::
3087db96d56Sopenharmony_ci
3097db96d56Sopenharmony_ci   >>> print(sys.exception())
3107db96d56Sopenharmony_ci   None
3117db96d56Sopenharmony_ci   >>> try:
3127db96d56Sopenharmony_ci   ...     raise TypeError
3137db96d56Sopenharmony_ci   ... except:
3147db96d56Sopenharmony_ci   ...     print(repr(sys.exception()))
3157db96d56Sopenharmony_ci   ...     try:
3167db96d56Sopenharmony_ci   ...          raise ValueError
3177db96d56Sopenharmony_ci   ...     except:
3187db96d56Sopenharmony_ci   ...         print(repr(sys.exception()))
3197db96d56Sopenharmony_ci   ...     print(repr(sys.exception()))
3207db96d56Sopenharmony_ci   ...
3217db96d56Sopenharmony_ci   TypeError()
3227db96d56Sopenharmony_ci   ValueError()
3237db96d56Sopenharmony_ci   TypeError()
3247db96d56Sopenharmony_ci   >>> print(sys.exception())
3257db96d56Sopenharmony_ci   None
3267db96d56Sopenharmony_ci
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci.. index::
3297db96d56Sopenharmony_ci   pair: keyword; except_star
3307db96d56Sopenharmony_ci
3317db96d56Sopenharmony_ci.. _except_star:
3327db96d56Sopenharmony_ci
3337db96d56Sopenharmony_ci:keyword:`!except*` clause
3347db96d56Sopenharmony_ci--------------------------
3357db96d56Sopenharmony_ci
3367db96d56Sopenharmony_ciThe :keyword:`!except*` clause(s) are used for handling
3377db96d56Sopenharmony_ci:exc:`ExceptionGroup`\s. The exception type for matching is interpreted as in
3387db96d56Sopenharmony_cithe case of :keyword:`except`, but in the case of exception groups we can have
3397db96d56Sopenharmony_cipartial matches when the type matches some of the exceptions in the group.
3407db96d56Sopenharmony_ciThis means that multiple :keyword:`!except*` clauses can execute,
3417db96d56Sopenharmony_cieach handling part of the exception group.
3427db96d56Sopenharmony_ciEach clause executes at most once and handles an exception group
3437db96d56Sopenharmony_ciof all matching exceptions.  Each exception in the group is handled by at most
3447db96d56Sopenharmony_cione :keyword:`!except*` clause, the first that matches it. ::
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ci   >>> try:
3477db96d56Sopenharmony_ci   ...     raise ExceptionGroup("eg",
3487db96d56Sopenharmony_ci   ...         [ValueError(1), TypeError(2), OSError(3), OSError(4)])
3497db96d56Sopenharmony_ci   ... except* TypeError as e:
3507db96d56Sopenharmony_ci   ...     print(f'caught {type(e)} with nested {e.exceptions}')
3517db96d56Sopenharmony_ci   ... except* OSError as e:
3527db96d56Sopenharmony_ci   ...     print(f'caught {type(e)} with nested {e.exceptions}')
3537db96d56Sopenharmony_ci   ...
3547db96d56Sopenharmony_ci   caught <class 'ExceptionGroup'> with nested (TypeError(2),)
3557db96d56Sopenharmony_ci   caught <class 'ExceptionGroup'> with nested (OSError(3), OSError(4))
3567db96d56Sopenharmony_ci     + Exception Group Traceback (most recent call last):
3577db96d56Sopenharmony_ci     |   File "<stdin>", line 2, in <module>
3587db96d56Sopenharmony_ci     | ExceptionGroup: eg
3597db96d56Sopenharmony_ci     +-+---------------- 1 ----------------
3607db96d56Sopenharmony_ci       | ValueError: 1
3617db96d56Sopenharmony_ci       +------------------------------------
3627db96d56Sopenharmony_ci
3637db96d56Sopenharmony_ci
3647db96d56Sopenharmony_ciAny remaining exceptions that were not handled by any :keyword:`!except*`
3657db96d56Sopenharmony_ciclause are re-raised at the end, combined into an exception group along with
3667db96d56Sopenharmony_ciall exceptions that were raised from within :keyword:`!except*` clauses.
3677db96d56Sopenharmony_ci
3687db96d56Sopenharmony_ciFrom version 3.11.4, when the entire :exc:`ExceptionGroup` is handled and
3697db96d56Sopenharmony_cionly one exception is raised from an :keyword:`!except*` clause, this
3707db96d56Sopenharmony_ciexception is no longer wrapped to form a new :exc:`ExceptionGroup`.
3717db96d56Sopenharmony_ci
3727db96d56Sopenharmony_ciIf the raised exception is not an exception group and its type matches
3737db96d56Sopenharmony_cione of the :keyword:`!except*` clauses, it is caught and wrapped by an
3747db96d56Sopenharmony_ciexception group with an empty message string. ::
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ci   >>> try:
3777db96d56Sopenharmony_ci   ...     raise BlockingIOError
3787db96d56Sopenharmony_ci   ... except* BlockingIOError as e:
3797db96d56Sopenharmony_ci   ...     print(repr(e))
3807db96d56Sopenharmony_ci   ...
3817db96d56Sopenharmony_ci   ExceptionGroup('', (BlockingIOError()))
3827db96d56Sopenharmony_ci
3837db96d56Sopenharmony_ciAn :keyword:`!except*` clause must have a matching type,
3847db96d56Sopenharmony_ciand this type cannot be a subclass of :exc:`BaseExceptionGroup`.
3857db96d56Sopenharmony_ciIt is not possible to mix :keyword:`except` and :keyword:`!except*`
3867db96d56Sopenharmony_ciin the same :keyword:`try`.
3877db96d56Sopenharmony_ci:keyword:`break`, :keyword:`continue` and :keyword:`return`
3887db96d56Sopenharmony_cicannot appear in an :keyword:`!except*` clause.
3897db96d56Sopenharmony_ci
3907db96d56Sopenharmony_ci
3917db96d56Sopenharmony_ci.. index::
3927db96d56Sopenharmony_ci   pair: keyword; else
3937db96d56Sopenharmony_ci   pair: statement; return
3947db96d56Sopenharmony_ci   pair: statement; break
3957db96d56Sopenharmony_ci   pair: statement; continue
3967db96d56Sopenharmony_ci
3977db96d56Sopenharmony_ci.. _except_else:
3987db96d56Sopenharmony_ci
3997db96d56Sopenharmony_ci:keyword:`!else` clause
4007db96d56Sopenharmony_ci-----------------------
4017db96d56Sopenharmony_ci
4027db96d56Sopenharmony_ciThe optional :keyword:`!else` clause is executed if the control flow leaves the
4037db96d56Sopenharmony_ci:keyword:`try` suite, no exception was raised, and no :keyword:`return`,
4047db96d56Sopenharmony_ci:keyword:`continue`, or :keyword:`break` statement was executed.  Exceptions in
4057db96d56Sopenharmony_cithe :keyword:`!else` clause are not handled by the preceding :keyword:`except`
4067db96d56Sopenharmony_ciclauses.
4077db96d56Sopenharmony_ci
4087db96d56Sopenharmony_ci
4097db96d56Sopenharmony_ci.. index:: pair: keyword; finally
4107db96d56Sopenharmony_ci
4117db96d56Sopenharmony_ci.. _finally:
4127db96d56Sopenharmony_ci
4137db96d56Sopenharmony_ci:keyword:`!finally` clause
4147db96d56Sopenharmony_ci--------------------------
4157db96d56Sopenharmony_ci
4167db96d56Sopenharmony_ciIf :keyword:`!finally` is present, it specifies a 'cleanup' handler.  The
4177db96d56Sopenharmony_ci:keyword:`try` clause is executed, including any :keyword:`except` and
4187db96d56Sopenharmony_ci:keyword:`else` clauses.  If an exception occurs in any of the clauses and is
4197db96d56Sopenharmony_cinot handled, the exception is temporarily saved. The :keyword:`!finally` clause
4207db96d56Sopenharmony_ciis executed.  If there is a saved exception it is re-raised at the end of the
4217db96d56Sopenharmony_ci:keyword:`!finally` clause.  If the :keyword:`!finally` clause raises another
4227db96d56Sopenharmony_ciexception, the saved exception is set as the context of the new exception.
4237db96d56Sopenharmony_ciIf the :keyword:`!finally` clause executes a :keyword:`return`, :keyword:`break`
4247db96d56Sopenharmony_cior :keyword:`continue` statement, the saved exception is discarded::
4257db96d56Sopenharmony_ci
4267db96d56Sopenharmony_ci   >>> def f():
4277db96d56Sopenharmony_ci   ...     try:
4287db96d56Sopenharmony_ci   ...         1/0
4297db96d56Sopenharmony_ci   ...     finally:
4307db96d56Sopenharmony_ci   ...         return 42
4317db96d56Sopenharmony_ci   ...
4327db96d56Sopenharmony_ci   >>> f()
4337db96d56Sopenharmony_ci   42
4347db96d56Sopenharmony_ci
4357db96d56Sopenharmony_ciThe exception information is not available to the program during execution of
4367db96d56Sopenharmony_cithe :keyword:`!finally` clause.
4377db96d56Sopenharmony_ci
4387db96d56Sopenharmony_ci.. index::
4397db96d56Sopenharmony_ci   pair: statement; return
4407db96d56Sopenharmony_ci   pair: statement; break
4417db96d56Sopenharmony_ci   pair: statement; continue
4427db96d56Sopenharmony_ci
4437db96d56Sopenharmony_ciWhen a :keyword:`return`, :keyword:`break` or :keyword:`continue` statement is
4447db96d56Sopenharmony_ciexecuted in the :keyword:`try` suite of a :keyword:`!try`...\ :keyword:`!finally`
4457db96d56Sopenharmony_cistatement, the :keyword:`!finally` clause is also executed 'on the way out.'
4467db96d56Sopenharmony_ci
4477db96d56Sopenharmony_ciThe return value of a function is determined by the last :keyword:`return`
4487db96d56Sopenharmony_cistatement executed.  Since the :keyword:`!finally` clause always executes, a
4497db96d56Sopenharmony_ci:keyword:`!return` statement executed in the :keyword:`!finally` clause will
4507db96d56Sopenharmony_cialways be the last one executed::
4517db96d56Sopenharmony_ci
4527db96d56Sopenharmony_ci   >>> def foo():
4537db96d56Sopenharmony_ci   ...     try:
4547db96d56Sopenharmony_ci   ...         return 'try'
4557db96d56Sopenharmony_ci   ...     finally:
4567db96d56Sopenharmony_ci   ...         return 'finally'
4577db96d56Sopenharmony_ci   ...
4587db96d56Sopenharmony_ci   >>> foo()
4597db96d56Sopenharmony_ci   'finally'
4607db96d56Sopenharmony_ci
4617db96d56Sopenharmony_ci.. versionchanged:: 3.8
4627db96d56Sopenharmony_ci   Prior to Python 3.8, a :keyword:`continue` statement was illegal in the
4637db96d56Sopenharmony_ci   :keyword:`!finally` clause due to a problem with the implementation.
4647db96d56Sopenharmony_ci
4657db96d56Sopenharmony_ci
4667db96d56Sopenharmony_ci.. _with:
4677db96d56Sopenharmony_ci.. _as:
4687db96d56Sopenharmony_ci
4697db96d56Sopenharmony_ciThe :keyword:`!with` statement
4707db96d56Sopenharmony_ci==============================
4717db96d56Sopenharmony_ci
4727db96d56Sopenharmony_ci.. index::
4737db96d56Sopenharmony_ci   ! pair: statement; with
4747db96d56Sopenharmony_ci   pair: keyword; as
4757db96d56Sopenharmony_ci   single: as; with statement
4767db96d56Sopenharmony_ci   single: , (comma); with statement
4777db96d56Sopenharmony_ci   single: : (colon); compound statement
4787db96d56Sopenharmony_ci
4797db96d56Sopenharmony_ciThe :keyword:`with` statement is used to wrap the execution of a block with
4807db96d56Sopenharmony_cimethods defined by a context manager (see section :ref:`context-managers`).
4817db96d56Sopenharmony_ciThis allows common :keyword:`try`...\ :keyword:`except`...\ :keyword:`finally`
4827db96d56Sopenharmony_ciusage patterns to be encapsulated for convenient reuse.
4837db96d56Sopenharmony_ci
4847db96d56Sopenharmony_ci.. productionlist:: python-grammar
4857db96d56Sopenharmony_ci   with_stmt: "with" ( "(" `with_stmt_contents` ","? ")" | `with_stmt_contents` ) ":" `suite`
4867db96d56Sopenharmony_ci   with_stmt_contents: `with_item` ("," `with_item`)*
4877db96d56Sopenharmony_ci   with_item: `expression` ["as" `target`]
4887db96d56Sopenharmony_ci
4897db96d56Sopenharmony_ciThe execution of the :keyword:`with` statement with one "item" proceeds as follows:
4907db96d56Sopenharmony_ci
4917db96d56Sopenharmony_ci#. The context expression (the expression given in the
4927db96d56Sopenharmony_ci   :token:`~python-grammar:with_item`) is evaluated to obtain a context manager.
4937db96d56Sopenharmony_ci
4947db96d56Sopenharmony_ci#. The context manager's :meth:`__enter__` is loaded for later use.
4957db96d56Sopenharmony_ci
4967db96d56Sopenharmony_ci#. The context manager's :meth:`__exit__` is loaded for later use.
4977db96d56Sopenharmony_ci
4987db96d56Sopenharmony_ci#. The context manager's :meth:`__enter__` method is invoked.
4997db96d56Sopenharmony_ci
5007db96d56Sopenharmony_ci#. If a target was included in the :keyword:`with` statement, the return value
5017db96d56Sopenharmony_ci   from :meth:`__enter__` is assigned to it.
5027db96d56Sopenharmony_ci
5037db96d56Sopenharmony_ci   .. note::
5047db96d56Sopenharmony_ci
5057db96d56Sopenharmony_ci      The :keyword:`with` statement guarantees that if the :meth:`__enter__`
5067db96d56Sopenharmony_ci      method returns without an error, then :meth:`__exit__` will always be
5077db96d56Sopenharmony_ci      called. Thus, if an error occurs during the assignment to the target list,
5087db96d56Sopenharmony_ci      it will be treated the same as an error occurring within the suite would
5097db96d56Sopenharmony_ci      be. See step 7 below.
5107db96d56Sopenharmony_ci
5117db96d56Sopenharmony_ci#. The suite is executed.
5127db96d56Sopenharmony_ci
5137db96d56Sopenharmony_ci#. The context manager's :meth:`__exit__` method is invoked.  If an exception
5147db96d56Sopenharmony_ci   caused the suite to be exited, its type, value, and traceback are passed as
5157db96d56Sopenharmony_ci   arguments to :meth:`__exit__`. Otherwise, three :const:`None` arguments are
5167db96d56Sopenharmony_ci   supplied.
5177db96d56Sopenharmony_ci
5187db96d56Sopenharmony_ci   If the suite was exited due to an exception, and the return value from the
5197db96d56Sopenharmony_ci   :meth:`__exit__` method was false, the exception is reraised.  If the return
5207db96d56Sopenharmony_ci   value was true, the exception is suppressed, and execution continues with the
5217db96d56Sopenharmony_ci   statement following the :keyword:`with` statement.
5227db96d56Sopenharmony_ci
5237db96d56Sopenharmony_ci   If the suite was exited for any reason other than an exception, the return
5247db96d56Sopenharmony_ci   value from :meth:`__exit__` is ignored, and execution proceeds at the normal
5257db96d56Sopenharmony_ci   location for the kind of exit that was taken.
5267db96d56Sopenharmony_ci
5277db96d56Sopenharmony_ciThe following code::
5287db96d56Sopenharmony_ci
5297db96d56Sopenharmony_ci    with EXPRESSION as TARGET:
5307db96d56Sopenharmony_ci        SUITE
5317db96d56Sopenharmony_ci
5327db96d56Sopenharmony_ciis semantically equivalent to::
5337db96d56Sopenharmony_ci
5347db96d56Sopenharmony_ci    manager = (EXPRESSION)
5357db96d56Sopenharmony_ci    enter = type(manager).__enter__
5367db96d56Sopenharmony_ci    exit = type(manager).__exit__
5377db96d56Sopenharmony_ci    value = enter(manager)
5387db96d56Sopenharmony_ci    hit_except = False
5397db96d56Sopenharmony_ci
5407db96d56Sopenharmony_ci    try:
5417db96d56Sopenharmony_ci        TARGET = value
5427db96d56Sopenharmony_ci        SUITE
5437db96d56Sopenharmony_ci    except:
5447db96d56Sopenharmony_ci        hit_except = True
5457db96d56Sopenharmony_ci        if not exit(manager, *sys.exc_info()):
5467db96d56Sopenharmony_ci            raise
5477db96d56Sopenharmony_ci    finally:
5487db96d56Sopenharmony_ci        if not hit_except:
5497db96d56Sopenharmony_ci            exit(manager, None, None, None)
5507db96d56Sopenharmony_ci
5517db96d56Sopenharmony_ciWith more than one item, the context managers are processed as if multiple
5527db96d56Sopenharmony_ci:keyword:`with` statements were nested::
5537db96d56Sopenharmony_ci
5547db96d56Sopenharmony_ci   with A() as a, B() as b:
5557db96d56Sopenharmony_ci       SUITE
5567db96d56Sopenharmony_ci
5577db96d56Sopenharmony_ciis semantically equivalent to::
5587db96d56Sopenharmony_ci
5597db96d56Sopenharmony_ci   with A() as a:
5607db96d56Sopenharmony_ci       with B() as b:
5617db96d56Sopenharmony_ci           SUITE
5627db96d56Sopenharmony_ci
5637db96d56Sopenharmony_ciYou can also write multi-item context managers in multiple lines if
5647db96d56Sopenharmony_cithe items are surrounded by parentheses. For example::
5657db96d56Sopenharmony_ci
5667db96d56Sopenharmony_ci   with (
5677db96d56Sopenharmony_ci       A() as a,
5687db96d56Sopenharmony_ci       B() as b,
5697db96d56Sopenharmony_ci   ):
5707db96d56Sopenharmony_ci       SUITE
5717db96d56Sopenharmony_ci
5727db96d56Sopenharmony_ci.. versionchanged:: 3.1
5737db96d56Sopenharmony_ci   Support for multiple context expressions.
5747db96d56Sopenharmony_ci
5757db96d56Sopenharmony_ci.. versionchanged:: 3.10
5767db96d56Sopenharmony_ci   Support for using grouping parentheses to break the statement in multiple lines.
5777db96d56Sopenharmony_ci
5787db96d56Sopenharmony_ci.. seealso::
5797db96d56Sopenharmony_ci
5807db96d56Sopenharmony_ci   :pep:`343` - The "with" statement
5817db96d56Sopenharmony_ci      The specification, background, and examples for the Python :keyword:`with`
5827db96d56Sopenharmony_ci      statement.
5837db96d56Sopenharmony_ci
5847db96d56Sopenharmony_ci.. _match:
5857db96d56Sopenharmony_ci
5867db96d56Sopenharmony_ciThe :keyword:`!match` statement
5877db96d56Sopenharmony_ci===============================
5887db96d56Sopenharmony_ci
5897db96d56Sopenharmony_ci.. index::
5907db96d56Sopenharmony_ci   ! pair: statement; match
5917db96d56Sopenharmony_ci   ! pair: keyword; case
5927db96d56Sopenharmony_ci   ! single: pattern matching
5937db96d56Sopenharmony_ci   pair: keyword; if
5947db96d56Sopenharmony_ci   pair: keyword; as
5957db96d56Sopenharmony_ci   pair: match; case
5967db96d56Sopenharmony_ci   single: as; match statement
5977db96d56Sopenharmony_ci   single: : (colon); compound statement
5987db96d56Sopenharmony_ci
5997db96d56Sopenharmony_ci.. versionadded:: 3.10
6007db96d56Sopenharmony_ci
6017db96d56Sopenharmony_ciThe match statement is used for pattern matching.  Syntax:
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ci.. productionlist:: python-grammar
6047db96d56Sopenharmony_ci   match_stmt: 'match' `subject_expr` ":" NEWLINE INDENT `case_block`+ DEDENT
6057db96d56Sopenharmony_ci   subject_expr: `star_named_expression` "," `star_named_expressions`?
6067db96d56Sopenharmony_ci               : | `named_expression`
6077db96d56Sopenharmony_ci   case_block: 'case' `patterns` [`guard`] ":" `block`
6087db96d56Sopenharmony_ci
6097db96d56Sopenharmony_ci.. note::
6107db96d56Sopenharmony_ci   This section uses single quotes to denote
6117db96d56Sopenharmony_ci   :ref:`soft keywords <soft-keywords>`.
6127db96d56Sopenharmony_ci
6137db96d56Sopenharmony_ciPattern matching takes a pattern as input (following ``case``) and a subject
6147db96d56Sopenharmony_civalue (following ``match``).  The pattern (which may contain subpatterns) is
6157db96d56Sopenharmony_cimatched against the subject value.  The outcomes are:
6167db96d56Sopenharmony_ci
6177db96d56Sopenharmony_ci* A match success or failure (also termed a pattern success or failure).
6187db96d56Sopenharmony_ci
6197db96d56Sopenharmony_ci* Possible binding of matched values to a name.  The prerequisites for this are
6207db96d56Sopenharmony_ci  further discussed below.
6217db96d56Sopenharmony_ci
6227db96d56Sopenharmony_ciThe ``match`` and ``case`` keywords are :ref:`soft keywords <soft-keywords>`.
6237db96d56Sopenharmony_ci
6247db96d56Sopenharmony_ci.. seealso::
6257db96d56Sopenharmony_ci
6267db96d56Sopenharmony_ci   * :pep:`634` -- Structural Pattern Matching: Specification
6277db96d56Sopenharmony_ci   * :pep:`636` -- Structural Pattern Matching: Tutorial
6287db96d56Sopenharmony_ci
6297db96d56Sopenharmony_ci
6307db96d56Sopenharmony_ciOverview
6317db96d56Sopenharmony_ci--------
6327db96d56Sopenharmony_ci
6337db96d56Sopenharmony_ciHere's an overview of the logical flow of a match statement:
6347db96d56Sopenharmony_ci
6357db96d56Sopenharmony_ci
6367db96d56Sopenharmony_ci#. The subject expression ``subject_expr`` is evaluated and a resulting subject
6377db96d56Sopenharmony_ci   value obtained. If the subject expression contains a comma, a tuple is
6387db96d56Sopenharmony_ci   constructed using :ref:`the standard rules <typesseq-tuple>`.
6397db96d56Sopenharmony_ci
6407db96d56Sopenharmony_ci#. Each pattern in a ``case_block`` is attempted to match with the subject value. The
6417db96d56Sopenharmony_ci   specific rules for success or failure are described below. The match attempt can also
6427db96d56Sopenharmony_ci   bind some or all of the standalone names within the pattern. The precise
6437db96d56Sopenharmony_ci   pattern binding rules vary per pattern type and are
6447db96d56Sopenharmony_ci   specified below.  **Name bindings made during a successful pattern match
6457db96d56Sopenharmony_ci   outlive the executed block and can be used after the match statement**.
6467db96d56Sopenharmony_ci
6477db96d56Sopenharmony_ci      .. note::
6487db96d56Sopenharmony_ci
6497db96d56Sopenharmony_ci         During failed pattern matches, some subpatterns may succeed.  Do not
6507db96d56Sopenharmony_ci         rely on bindings being made for a failed match.  Conversely, do not
6517db96d56Sopenharmony_ci         rely on variables remaining unchanged after a failed match.  The exact
6527db96d56Sopenharmony_ci         behavior is dependent on implementation and may vary.  This is an
6537db96d56Sopenharmony_ci         intentional decision made to allow different implementations to add
6547db96d56Sopenharmony_ci         optimizations.
6557db96d56Sopenharmony_ci
6567db96d56Sopenharmony_ci#. If the pattern succeeds, the corresponding guard (if present) is evaluated. In
6577db96d56Sopenharmony_ci   this case all name bindings are guaranteed to have happened.
6587db96d56Sopenharmony_ci
6597db96d56Sopenharmony_ci   * If the guard evaluates as true or is missing, the ``block`` inside
6607db96d56Sopenharmony_ci     ``case_block`` is executed.
6617db96d56Sopenharmony_ci
6627db96d56Sopenharmony_ci   * Otherwise, the next ``case_block`` is attempted as described above.
6637db96d56Sopenharmony_ci
6647db96d56Sopenharmony_ci   * If there are no further case blocks, the match statement is completed.
6657db96d56Sopenharmony_ci
6667db96d56Sopenharmony_ci.. note::
6677db96d56Sopenharmony_ci
6687db96d56Sopenharmony_ci   Users should generally never rely on a pattern being evaluated.  Depending on
6697db96d56Sopenharmony_ci   implementation, the interpreter may cache values or use other optimizations
6707db96d56Sopenharmony_ci   which skip repeated evaluations.
6717db96d56Sopenharmony_ci
6727db96d56Sopenharmony_ciA sample match statement::
6737db96d56Sopenharmony_ci
6747db96d56Sopenharmony_ci   >>> flag = False
6757db96d56Sopenharmony_ci   >>> match (100, 200):
6767db96d56Sopenharmony_ci   ...    case (100, 300):  # Mismatch: 200 != 300
6777db96d56Sopenharmony_ci   ...        print('Case 1')
6787db96d56Sopenharmony_ci   ...    case (100, 200) if flag:  # Successful match, but guard fails
6797db96d56Sopenharmony_ci   ...        print('Case 2')
6807db96d56Sopenharmony_ci   ...    case (100, y):  # Matches and binds y to 200
6817db96d56Sopenharmony_ci   ...        print(f'Case 3, y: {y}')
6827db96d56Sopenharmony_ci   ...    case _:  # Pattern not attempted
6837db96d56Sopenharmony_ci   ...        print('Case 4, I match anything!')
6847db96d56Sopenharmony_ci   ...
6857db96d56Sopenharmony_ci   Case 3, y: 200
6867db96d56Sopenharmony_ci
6877db96d56Sopenharmony_ci
6887db96d56Sopenharmony_ciIn this case, ``if flag`` is a guard.  Read more about that in the next section.
6897db96d56Sopenharmony_ci
6907db96d56Sopenharmony_ciGuards
6917db96d56Sopenharmony_ci------
6927db96d56Sopenharmony_ci
6937db96d56Sopenharmony_ci.. index:: ! guard
6947db96d56Sopenharmony_ci
6957db96d56Sopenharmony_ci.. productionlist:: python-grammar
6967db96d56Sopenharmony_ci   guard: "if" `named_expression`
6977db96d56Sopenharmony_ci
6987db96d56Sopenharmony_ciA ``guard`` (which is part of the ``case``) must succeed for code inside
6997db96d56Sopenharmony_cithe ``case`` block to execute.  It takes the form: :keyword:`if` followed by an
7007db96d56Sopenharmony_ciexpression.
7017db96d56Sopenharmony_ci
7027db96d56Sopenharmony_ci
7037db96d56Sopenharmony_ciThe logical flow of a ``case`` block with a ``guard`` follows:
7047db96d56Sopenharmony_ci
7057db96d56Sopenharmony_ci#. Check that the pattern in the ``case`` block succeeded.  If the pattern
7067db96d56Sopenharmony_ci   failed, the ``guard`` is not evaluated and the next ``case`` block is
7077db96d56Sopenharmony_ci   checked.
7087db96d56Sopenharmony_ci
7097db96d56Sopenharmony_ci#. If the pattern succeeded, evaluate the ``guard``.
7107db96d56Sopenharmony_ci
7117db96d56Sopenharmony_ci   * If the ``guard`` condition evaluates as true, the case block is
7127db96d56Sopenharmony_ci     selected.
7137db96d56Sopenharmony_ci
7147db96d56Sopenharmony_ci   * If the ``guard`` condition evaluates as false, the case block is not
7157db96d56Sopenharmony_ci     selected.
7167db96d56Sopenharmony_ci
7177db96d56Sopenharmony_ci   * If the ``guard`` raises an exception during evaluation, the exception
7187db96d56Sopenharmony_ci     bubbles up.
7197db96d56Sopenharmony_ci
7207db96d56Sopenharmony_ciGuards are allowed to have side effects as they are expressions.  Guard
7217db96d56Sopenharmony_cievaluation must proceed from the first to the last case block, one at a time,
7227db96d56Sopenharmony_ciskipping case blocks whose pattern(s) don't all succeed. (I.e.,
7237db96d56Sopenharmony_ciguard evaluation must happen in order.) Guard evaluation must stop once a case
7247db96d56Sopenharmony_ciblock is selected.
7257db96d56Sopenharmony_ci
7267db96d56Sopenharmony_ci
7277db96d56Sopenharmony_ci.. _irrefutable_case:
7287db96d56Sopenharmony_ci
7297db96d56Sopenharmony_ciIrrefutable Case Blocks
7307db96d56Sopenharmony_ci-----------------------
7317db96d56Sopenharmony_ci
7327db96d56Sopenharmony_ci.. index:: irrefutable case block, case block
7337db96d56Sopenharmony_ci
7347db96d56Sopenharmony_ciAn irrefutable case block is a match-all case block.  A match statement may have
7357db96d56Sopenharmony_ciat most one irrefutable case block, and it must be last.
7367db96d56Sopenharmony_ci
7377db96d56Sopenharmony_ciA case block is considered irrefutable if it has no guard and its pattern is
7387db96d56Sopenharmony_ciirrefutable.  A pattern is considered irrefutable if we can prove from its
7397db96d56Sopenharmony_cisyntax alone that it will always succeed.  Only the following patterns are
7407db96d56Sopenharmony_ciirrefutable:
7417db96d56Sopenharmony_ci
7427db96d56Sopenharmony_ci* :ref:`as-patterns` whose left-hand side is irrefutable
7437db96d56Sopenharmony_ci
7447db96d56Sopenharmony_ci* :ref:`or-patterns` containing at least one irrefutable pattern
7457db96d56Sopenharmony_ci
7467db96d56Sopenharmony_ci* :ref:`capture-patterns`
7477db96d56Sopenharmony_ci
7487db96d56Sopenharmony_ci* :ref:`wildcard-patterns`
7497db96d56Sopenharmony_ci
7507db96d56Sopenharmony_ci* parenthesized irrefutable patterns
7517db96d56Sopenharmony_ci
7527db96d56Sopenharmony_ci
7537db96d56Sopenharmony_ciPatterns
7547db96d56Sopenharmony_ci--------
7557db96d56Sopenharmony_ci
7567db96d56Sopenharmony_ci.. index::
7577db96d56Sopenharmony_ci   single: ! patterns
7587db96d56Sopenharmony_ci   single: AS pattern, OR pattern, capture pattern, wildcard pattern
7597db96d56Sopenharmony_ci
7607db96d56Sopenharmony_ci.. note::
7617db96d56Sopenharmony_ci   This section uses grammar notations beyond standard EBNF:
7627db96d56Sopenharmony_ci
7637db96d56Sopenharmony_ci   * the notation ``SEP.RULE+`` is shorthand for ``RULE (SEP RULE)*``
7647db96d56Sopenharmony_ci
7657db96d56Sopenharmony_ci   * the notation ``!RULE`` is shorthand for a negative lookahead assertion
7667db96d56Sopenharmony_ci
7677db96d56Sopenharmony_ci
7687db96d56Sopenharmony_ciThe top-level syntax for ``patterns`` is:
7697db96d56Sopenharmony_ci
7707db96d56Sopenharmony_ci.. productionlist:: python-grammar
7717db96d56Sopenharmony_ci   patterns: `open_sequence_pattern` | `pattern`
7727db96d56Sopenharmony_ci   pattern: `as_pattern` | `or_pattern`
7737db96d56Sopenharmony_ci   closed_pattern: | `literal_pattern`
7747db96d56Sopenharmony_ci                 : | `capture_pattern`
7757db96d56Sopenharmony_ci                 : | `wildcard_pattern`
7767db96d56Sopenharmony_ci                 : | `value_pattern`
7777db96d56Sopenharmony_ci                 : | `group_pattern`
7787db96d56Sopenharmony_ci                 : | `sequence_pattern`
7797db96d56Sopenharmony_ci                 : | `mapping_pattern`
7807db96d56Sopenharmony_ci                 : | `class_pattern`
7817db96d56Sopenharmony_ci
7827db96d56Sopenharmony_ciThe descriptions below will include a description "in simple terms" of what a pattern
7837db96d56Sopenharmony_cidoes for illustration purposes (credits to Raymond Hettinger for a document that
7847db96d56Sopenharmony_ciinspired most of the descriptions). Note that these descriptions are purely for
7857db96d56Sopenharmony_ciillustration purposes and **may not** reflect
7867db96d56Sopenharmony_cithe underlying implementation.  Furthermore, they do not cover all valid forms.
7877db96d56Sopenharmony_ci
7887db96d56Sopenharmony_ci
7897db96d56Sopenharmony_ci.. _or-patterns:
7907db96d56Sopenharmony_ci
7917db96d56Sopenharmony_ciOR Patterns
7927db96d56Sopenharmony_ci^^^^^^^^^^^
7937db96d56Sopenharmony_ci
7947db96d56Sopenharmony_ciAn OR pattern is two or more patterns separated by vertical
7957db96d56Sopenharmony_cibars ``|``.  Syntax:
7967db96d56Sopenharmony_ci
7977db96d56Sopenharmony_ci.. productionlist:: python-grammar
7987db96d56Sopenharmony_ci   or_pattern: "|".`closed_pattern`+
7997db96d56Sopenharmony_ci
8007db96d56Sopenharmony_ciOnly the final subpattern may be :ref:`irrefutable <irrefutable_case>`, and each
8017db96d56Sopenharmony_cisubpattern must bind the same set of names to avoid ambiguity.
8027db96d56Sopenharmony_ci
8037db96d56Sopenharmony_ciAn OR pattern matches each of its subpatterns in turn to the subject value,
8047db96d56Sopenharmony_ciuntil one succeeds.  The OR pattern is then considered successful.  Otherwise,
8057db96d56Sopenharmony_ciif none of the subpatterns succeed, the OR pattern fails.
8067db96d56Sopenharmony_ci
8077db96d56Sopenharmony_ciIn simple terms, ``P1 | P2 | ...`` will try to match ``P1``, if it fails it will try to
8087db96d56Sopenharmony_cimatch ``P2``, succeeding immediately if any succeeds, failing otherwise.
8097db96d56Sopenharmony_ci
8107db96d56Sopenharmony_ci.. _as-patterns:
8117db96d56Sopenharmony_ci
8127db96d56Sopenharmony_ciAS Patterns
8137db96d56Sopenharmony_ci^^^^^^^^^^^
8147db96d56Sopenharmony_ci
8157db96d56Sopenharmony_ciAn AS pattern matches an OR pattern on the left of the :keyword:`as`
8167db96d56Sopenharmony_cikeyword against a subject.  Syntax:
8177db96d56Sopenharmony_ci
8187db96d56Sopenharmony_ci.. productionlist:: python-grammar
8197db96d56Sopenharmony_ci   as_pattern: `or_pattern` "as" `capture_pattern`
8207db96d56Sopenharmony_ci
8217db96d56Sopenharmony_ciIf the OR pattern fails, the AS pattern fails.  Otherwise, the AS pattern binds
8227db96d56Sopenharmony_cithe subject to the name on the right of the as keyword and succeeds.
8237db96d56Sopenharmony_ci``capture_pattern`` cannot be a ``_``.
8247db96d56Sopenharmony_ci
8257db96d56Sopenharmony_ciIn simple terms ``P as NAME`` will match with ``P``, and on success it will
8267db96d56Sopenharmony_ciset ``NAME = <subject>``.
8277db96d56Sopenharmony_ci
8287db96d56Sopenharmony_ci
8297db96d56Sopenharmony_ci.. _literal-patterns:
8307db96d56Sopenharmony_ci
8317db96d56Sopenharmony_ciLiteral Patterns
8327db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^
8337db96d56Sopenharmony_ci
8347db96d56Sopenharmony_ciA literal pattern corresponds to most
8357db96d56Sopenharmony_ci:ref:`literals <literals>` in Python.  Syntax:
8367db96d56Sopenharmony_ci
8377db96d56Sopenharmony_ci.. productionlist:: python-grammar
8387db96d56Sopenharmony_ci   literal_pattern: `signed_number`
8397db96d56Sopenharmony_ci                  : | `signed_number` "+" NUMBER
8407db96d56Sopenharmony_ci                  : | `signed_number` "-" NUMBER
8417db96d56Sopenharmony_ci                  : | `strings`
8427db96d56Sopenharmony_ci                  : | "None"
8437db96d56Sopenharmony_ci                  : | "True"
8447db96d56Sopenharmony_ci                  : | "False"
8457db96d56Sopenharmony_ci                  : | `signed_number`: NUMBER | "-" NUMBER
8467db96d56Sopenharmony_ci
8477db96d56Sopenharmony_ciThe rule ``strings`` and the token ``NUMBER`` are defined in the
8487db96d56Sopenharmony_ci:doc:`standard Python grammar <./grammar>`.  Triple-quoted strings are
8497db96d56Sopenharmony_cisupported.  Raw strings and byte strings are supported.  :ref:`f-strings` are
8507db96d56Sopenharmony_cinot supported.
8517db96d56Sopenharmony_ci
8527db96d56Sopenharmony_ciThe forms ``signed_number '+' NUMBER`` and ``signed_number '-' NUMBER`` are
8537db96d56Sopenharmony_cifor expressing :ref:`complex numbers <imaginary>`; they require a real number
8547db96d56Sopenharmony_cion the left and an imaginary number on the right. E.g. ``3 + 4j``.
8557db96d56Sopenharmony_ci
8567db96d56Sopenharmony_ciIn simple terms, ``LITERAL`` will succeed only if ``<subject> == LITERAL``. For
8577db96d56Sopenharmony_cithe singletons ``None``, ``True`` and ``False``, the :keyword:`is` operator is used.
8587db96d56Sopenharmony_ci
8597db96d56Sopenharmony_ci.. _capture-patterns:
8607db96d56Sopenharmony_ci
8617db96d56Sopenharmony_ciCapture Patterns
8627db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^
8637db96d56Sopenharmony_ci
8647db96d56Sopenharmony_ciA capture pattern binds the subject value to a name.
8657db96d56Sopenharmony_ciSyntax:
8667db96d56Sopenharmony_ci
8677db96d56Sopenharmony_ci.. productionlist:: python-grammar
8687db96d56Sopenharmony_ci   capture_pattern: !'_' NAME
8697db96d56Sopenharmony_ci
8707db96d56Sopenharmony_ciA single underscore ``_`` is not a capture pattern (this is what ``!'_'``
8717db96d56Sopenharmony_ciexpresses). It is instead treated as a
8727db96d56Sopenharmony_ci:token:`~python-grammar:wildcard_pattern`.
8737db96d56Sopenharmony_ci
8747db96d56Sopenharmony_ciIn a given pattern, a given name can only be bound once.  E.g.
8757db96d56Sopenharmony_ci``case x, x: ...`` is invalid while ``case [x] | x: ...`` is allowed.
8767db96d56Sopenharmony_ci
8777db96d56Sopenharmony_ciCapture patterns always succeed.  The binding follows scoping rules
8787db96d56Sopenharmony_ciestablished by the assignment expression operator in :pep:`572`; the
8797db96d56Sopenharmony_ciname becomes a local variable in the closest containing function scope unless
8807db96d56Sopenharmony_cithere's an applicable :keyword:`global` or :keyword:`nonlocal` statement.
8817db96d56Sopenharmony_ci
8827db96d56Sopenharmony_ciIn simple terms ``NAME`` will always succeed and it will set ``NAME = <subject>``.
8837db96d56Sopenharmony_ci
8847db96d56Sopenharmony_ci.. _wildcard-patterns:
8857db96d56Sopenharmony_ci
8867db96d56Sopenharmony_ciWildcard Patterns
8877db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^
8887db96d56Sopenharmony_ci
8897db96d56Sopenharmony_ciA wildcard pattern always succeeds (matches anything)
8907db96d56Sopenharmony_ciand binds no name.  Syntax:
8917db96d56Sopenharmony_ci
8927db96d56Sopenharmony_ci.. productionlist:: python-grammar
8937db96d56Sopenharmony_ci   wildcard_pattern: '_'
8947db96d56Sopenharmony_ci
8957db96d56Sopenharmony_ci``_`` is a :ref:`soft keyword <soft-keywords>` within any pattern,
8967db96d56Sopenharmony_cibut only within patterns.  It is an identifier, as usual, even within
8977db96d56Sopenharmony_ci``match`` subject expressions, ``guard``\ s, and ``case`` blocks.
8987db96d56Sopenharmony_ci
8997db96d56Sopenharmony_ciIn simple terms, ``_`` will always succeed.
9007db96d56Sopenharmony_ci
9017db96d56Sopenharmony_ci.. _value-patterns:
9027db96d56Sopenharmony_ci
9037db96d56Sopenharmony_ciValue Patterns
9047db96d56Sopenharmony_ci^^^^^^^^^^^^^^
9057db96d56Sopenharmony_ci
9067db96d56Sopenharmony_ciA value pattern represents a named value in Python.
9077db96d56Sopenharmony_ciSyntax:
9087db96d56Sopenharmony_ci
9097db96d56Sopenharmony_ci.. productionlist:: python-grammar
9107db96d56Sopenharmony_ci   value_pattern: `attr`
9117db96d56Sopenharmony_ci   attr: `name_or_attr` "." NAME
9127db96d56Sopenharmony_ci   name_or_attr: `attr` | NAME
9137db96d56Sopenharmony_ci
9147db96d56Sopenharmony_ciThe dotted name in the pattern is looked up using standard Python
9157db96d56Sopenharmony_ci:ref:`name resolution rules <resolve_names>`.  The pattern succeeds if the
9167db96d56Sopenharmony_civalue found compares equal to the subject value (using the ``==`` equality
9177db96d56Sopenharmony_cioperator).
9187db96d56Sopenharmony_ci
9197db96d56Sopenharmony_ciIn simple terms ``NAME1.NAME2`` will succeed only if ``<subject> == NAME1.NAME2``
9207db96d56Sopenharmony_ci
9217db96d56Sopenharmony_ci.. note::
9227db96d56Sopenharmony_ci
9237db96d56Sopenharmony_ci  If the same value occurs multiple times in the same match statement, the
9247db96d56Sopenharmony_ci  interpreter may cache the first value found and reuse it rather than repeat
9257db96d56Sopenharmony_ci  the same lookup.  This cache is strictly tied to a given execution of a
9267db96d56Sopenharmony_ci  given match statement.
9277db96d56Sopenharmony_ci
9287db96d56Sopenharmony_ci.. _group-patterns:
9297db96d56Sopenharmony_ci
9307db96d56Sopenharmony_ciGroup Patterns
9317db96d56Sopenharmony_ci^^^^^^^^^^^^^^
9327db96d56Sopenharmony_ci
9337db96d56Sopenharmony_ciA group pattern allows users to add parentheses around patterns to
9347db96d56Sopenharmony_ciemphasize the intended grouping.  Otherwise, it has no additional syntax.
9357db96d56Sopenharmony_ciSyntax:
9367db96d56Sopenharmony_ci
9377db96d56Sopenharmony_ci.. productionlist:: python-grammar
9387db96d56Sopenharmony_ci   group_pattern: "(" `pattern` ")"
9397db96d56Sopenharmony_ci
9407db96d56Sopenharmony_ciIn simple terms ``(P)`` has the same effect as ``P``.
9417db96d56Sopenharmony_ci
9427db96d56Sopenharmony_ci.. _sequence-patterns:
9437db96d56Sopenharmony_ci
9447db96d56Sopenharmony_ciSequence Patterns
9457db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^
9467db96d56Sopenharmony_ci
9477db96d56Sopenharmony_ciA sequence pattern contains several subpatterns to be matched against sequence elements.
9487db96d56Sopenharmony_ciThe syntax is similar to the unpacking of a list or tuple.
9497db96d56Sopenharmony_ci
9507db96d56Sopenharmony_ci.. productionlist:: python-grammar
9517db96d56Sopenharmony_ci  sequence_pattern: "[" [`maybe_sequence_pattern`] "]"
9527db96d56Sopenharmony_ci                  : | "(" [`open_sequence_pattern`] ")"
9537db96d56Sopenharmony_ci  open_sequence_pattern: `maybe_star_pattern` "," [`maybe_sequence_pattern`]
9547db96d56Sopenharmony_ci  maybe_sequence_pattern: ",".`maybe_star_pattern`+ ","?
9557db96d56Sopenharmony_ci  maybe_star_pattern: `star_pattern` | `pattern`
9567db96d56Sopenharmony_ci  star_pattern: "*" (`capture_pattern` | `wildcard_pattern`)
9577db96d56Sopenharmony_ci
9587db96d56Sopenharmony_ciThere is no difference if parentheses  or square brackets
9597db96d56Sopenharmony_ciare used for sequence patterns (i.e. ``(...)`` vs ``[...]`` ).
9607db96d56Sopenharmony_ci
9617db96d56Sopenharmony_ci.. note::
9627db96d56Sopenharmony_ci   A single pattern enclosed in parentheses without a trailing comma
9637db96d56Sopenharmony_ci   (e.g. ``(3 | 4)``) is a :ref:`group pattern <group-patterns>`.
9647db96d56Sopenharmony_ci   While a single pattern enclosed in square brackets (e.g. ``[3 | 4]``) is
9657db96d56Sopenharmony_ci   still a sequence pattern.
9667db96d56Sopenharmony_ci
9677db96d56Sopenharmony_ciAt most one star subpattern may be in a sequence pattern.  The star subpattern
9687db96d56Sopenharmony_cimay occur in any position. If no star subpattern is present, the sequence
9697db96d56Sopenharmony_cipattern is a fixed-length sequence pattern; otherwise it is a variable-length
9707db96d56Sopenharmony_cisequence pattern.
9717db96d56Sopenharmony_ci
9727db96d56Sopenharmony_ciThe following is the logical flow for matching a sequence pattern against a
9737db96d56Sopenharmony_cisubject value:
9747db96d56Sopenharmony_ci
9757db96d56Sopenharmony_ci#. If the subject value is not a sequence [#]_, the sequence pattern
9767db96d56Sopenharmony_ci   fails.
9777db96d56Sopenharmony_ci
9787db96d56Sopenharmony_ci#. If the subject value is an instance of ``str``, ``bytes`` or ``bytearray``
9797db96d56Sopenharmony_ci   the sequence pattern fails.
9807db96d56Sopenharmony_ci
9817db96d56Sopenharmony_ci#. The subsequent steps depend on whether the sequence pattern is fixed or
9827db96d56Sopenharmony_ci   variable-length.
9837db96d56Sopenharmony_ci
9847db96d56Sopenharmony_ci   If the sequence pattern is fixed-length:
9857db96d56Sopenharmony_ci
9867db96d56Sopenharmony_ci   #. If the length of the subject sequence is not equal to the number of
9877db96d56Sopenharmony_ci      subpatterns, the sequence pattern fails
9887db96d56Sopenharmony_ci
9897db96d56Sopenharmony_ci   #. Subpatterns in the sequence pattern are matched to their corresponding
9907db96d56Sopenharmony_ci      items in the subject sequence from left to right.  Matching stops as soon
9917db96d56Sopenharmony_ci      as a subpattern fails.  If all subpatterns succeed in matching their
9927db96d56Sopenharmony_ci      corresponding item, the sequence pattern succeeds.
9937db96d56Sopenharmony_ci
9947db96d56Sopenharmony_ci   Otherwise, if the sequence pattern is variable-length:
9957db96d56Sopenharmony_ci
9967db96d56Sopenharmony_ci   #. If the length of the subject sequence is less than the number of non-star
9977db96d56Sopenharmony_ci      subpatterns, the sequence pattern fails.
9987db96d56Sopenharmony_ci
9997db96d56Sopenharmony_ci   #. The leading non-star subpatterns are matched to their corresponding items
10007db96d56Sopenharmony_ci      as for fixed-length sequences.
10017db96d56Sopenharmony_ci
10027db96d56Sopenharmony_ci   #. If the previous step succeeds, the star subpattern matches a list formed
10037db96d56Sopenharmony_ci      of the remaining subject items, excluding the remaining items
10047db96d56Sopenharmony_ci      corresponding to non-star subpatterns following the star subpattern.
10057db96d56Sopenharmony_ci
10067db96d56Sopenharmony_ci   #. Remaining non-star subpatterns are matched to their corresponding subject
10077db96d56Sopenharmony_ci      items, as for a fixed-length sequence.
10087db96d56Sopenharmony_ci
10097db96d56Sopenharmony_ci   .. note:: The length of the subject sequence is obtained via
10107db96d56Sopenharmony_ci      :func:`len` (i.e. via the :meth:`__len__` protocol).  This length may be
10117db96d56Sopenharmony_ci      cached by the interpreter in a similar manner as
10127db96d56Sopenharmony_ci      :ref:`value patterns <value-patterns>`.
10137db96d56Sopenharmony_ci
10147db96d56Sopenharmony_ci
10157db96d56Sopenharmony_ciIn simple terms ``[P1, P2, P3,`` ... ``, P<N>]`` matches only if all the following
10167db96d56Sopenharmony_cihappens:
10177db96d56Sopenharmony_ci
10187db96d56Sopenharmony_ci* check ``<subject>`` is a sequence
10197db96d56Sopenharmony_ci* ``len(subject) == <N>``
10207db96d56Sopenharmony_ci* ``P1`` matches ``<subject>[0]`` (note that this match can also bind names)
10217db96d56Sopenharmony_ci* ``P2`` matches ``<subject>[1]`` (note that this match can also bind names)
10227db96d56Sopenharmony_ci* ... and so on for the corresponding pattern/element.
10237db96d56Sopenharmony_ci
10247db96d56Sopenharmony_ci.. _mapping-patterns:
10257db96d56Sopenharmony_ci
10267db96d56Sopenharmony_ciMapping Patterns
10277db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^
10287db96d56Sopenharmony_ci
10297db96d56Sopenharmony_ciA mapping pattern contains one or more key-value patterns.  The syntax is
10307db96d56Sopenharmony_cisimilar to the construction of a dictionary.
10317db96d56Sopenharmony_ciSyntax:
10327db96d56Sopenharmony_ci
10337db96d56Sopenharmony_ci.. productionlist:: python-grammar
10347db96d56Sopenharmony_ci   mapping_pattern: "{" [`items_pattern`] "}"
10357db96d56Sopenharmony_ci   items_pattern: ",".`key_value_pattern`+ ","?
10367db96d56Sopenharmony_ci   key_value_pattern: (`literal_pattern` | `value_pattern`) ":" `pattern`
10377db96d56Sopenharmony_ci                    : | `double_star_pattern`
10387db96d56Sopenharmony_ci   double_star_pattern: "**" `capture_pattern`
10397db96d56Sopenharmony_ci
10407db96d56Sopenharmony_ciAt most one double star pattern may be in a mapping pattern.  The double star
10417db96d56Sopenharmony_cipattern must be the last subpattern in the mapping pattern.
10427db96d56Sopenharmony_ci
10437db96d56Sopenharmony_ciDuplicate keys in mapping patterns are disallowed. Duplicate literal keys will
10447db96d56Sopenharmony_ciraise a :exc:`SyntaxError`. Two keys that otherwise have the same value will
10457db96d56Sopenharmony_ciraise a :exc:`ValueError` at runtime.
10467db96d56Sopenharmony_ci
10477db96d56Sopenharmony_ciThe following is the logical flow for matching a mapping pattern against a
10487db96d56Sopenharmony_cisubject value:
10497db96d56Sopenharmony_ci
10507db96d56Sopenharmony_ci#. If the subject value is not a mapping [#]_,the mapping pattern fails.
10517db96d56Sopenharmony_ci
10527db96d56Sopenharmony_ci#. If every key given in the mapping pattern is present in the subject mapping,
10537db96d56Sopenharmony_ci   and the pattern for each key matches the corresponding item of the subject
10547db96d56Sopenharmony_ci   mapping, the mapping pattern succeeds.
10557db96d56Sopenharmony_ci
10567db96d56Sopenharmony_ci#. If duplicate keys are detected in the mapping pattern, the pattern is
10577db96d56Sopenharmony_ci   considered invalid. A :exc:`SyntaxError` is raised for duplicate literal
10587db96d56Sopenharmony_ci   values; or a :exc:`ValueError` for named keys of the same value.
10597db96d56Sopenharmony_ci
10607db96d56Sopenharmony_ci.. note:: Key-value pairs are matched using the two-argument form of the mapping
10617db96d56Sopenharmony_ci   subject's ``get()`` method.  Matched key-value pairs must already be present
10627db96d56Sopenharmony_ci   in the mapping, and not created on-the-fly via :meth:`__missing__` or
10637db96d56Sopenharmony_ci   :meth:`__getitem__`.
10647db96d56Sopenharmony_ci
10657db96d56Sopenharmony_ciIn simple terms ``{KEY1: P1, KEY2: P2, ... }`` matches only if all the following
10667db96d56Sopenharmony_cihappens:
10677db96d56Sopenharmony_ci
10687db96d56Sopenharmony_ci* check ``<subject>`` is a mapping
10697db96d56Sopenharmony_ci* ``KEY1 in <subject>``
10707db96d56Sopenharmony_ci* ``P1`` matches ``<subject>[KEY1]``
10717db96d56Sopenharmony_ci* ... and so on for the corresponding KEY/pattern pair.
10727db96d56Sopenharmony_ci
10737db96d56Sopenharmony_ci
10747db96d56Sopenharmony_ci.. _class-patterns:
10757db96d56Sopenharmony_ci
10767db96d56Sopenharmony_ciClass Patterns
10777db96d56Sopenharmony_ci^^^^^^^^^^^^^^
10787db96d56Sopenharmony_ci
10797db96d56Sopenharmony_ciA class pattern represents a class and its positional and keyword arguments
10807db96d56Sopenharmony_ci(if any).  Syntax:
10817db96d56Sopenharmony_ci
10827db96d56Sopenharmony_ci.. productionlist:: python-grammar
10837db96d56Sopenharmony_ci  class_pattern: `name_or_attr` "(" [`pattern_arguments` ","?] ")"
10847db96d56Sopenharmony_ci  pattern_arguments: `positional_patterns` ["," `keyword_patterns`]
10857db96d56Sopenharmony_ci                   : | `keyword_patterns`
10867db96d56Sopenharmony_ci  positional_patterns: ",".`pattern`+
10877db96d56Sopenharmony_ci  keyword_patterns: ",".`keyword_pattern`+
10887db96d56Sopenharmony_ci  keyword_pattern: NAME "=" `pattern`
10897db96d56Sopenharmony_ci
10907db96d56Sopenharmony_ciThe same keyword should not be repeated in class patterns.
10917db96d56Sopenharmony_ci
10927db96d56Sopenharmony_ciThe following is the logical flow for matching a class pattern against a
10937db96d56Sopenharmony_cisubject value:
10947db96d56Sopenharmony_ci
10957db96d56Sopenharmony_ci#. If ``name_or_attr`` is not an instance of the builtin :class:`type` , raise
10967db96d56Sopenharmony_ci   :exc:`TypeError`.
10977db96d56Sopenharmony_ci
10987db96d56Sopenharmony_ci#. If the subject value is not an instance of ``name_or_attr`` (tested via
10997db96d56Sopenharmony_ci   :func:`isinstance`), the class pattern fails.
11007db96d56Sopenharmony_ci
11017db96d56Sopenharmony_ci#. If no pattern arguments are present, the pattern succeeds.  Otherwise,
11027db96d56Sopenharmony_ci   the subsequent steps depend on whether keyword or positional argument patterns
11037db96d56Sopenharmony_ci   are present.
11047db96d56Sopenharmony_ci
11057db96d56Sopenharmony_ci   For a number of built-in types (specified below), a single positional
11067db96d56Sopenharmony_ci   subpattern is accepted which will match the entire subject; for these types
11077db96d56Sopenharmony_ci   keyword patterns also work as for other types.
11087db96d56Sopenharmony_ci
11097db96d56Sopenharmony_ci   If only keyword patterns are present, they are processed as follows,
11107db96d56Sopenharmony_ci   one by one:
11117db96d56Sopenharmony_ci
11127db96d56Sopenharmony_ci   I. The keyword is looked up as an attribute on the subject.
11137db96d56Sopenharmony_ci
11147db96d56Sopenharmony_ci      * If this raises an exception other than :exc:`AttributeError`, the
11157db96d56Sopenharmony_ci        exception bubbles up.
11167db96d56Sopenharmony_ci
11177db96d56Sopenharmony_ci      * If this raises :exc:`AttributeError`, the class pattern has failed.
11187db96d56Sopenharmony_ci
11197db96d56Sopenharmony_ci      * Else, the subpattern associated with the keyword pattern is matched
11207db96d56Sopenharmony_ci        against the subject's attribute value.  If this fails, the class
11217db96d56Sopenharmony_ci        pattern fails; if this succeeds, the match proceeds to the next keyword.
11227db96d56Sopenharmony_ci
11237db96d56Sopenharmony_ci
11247db96d56Sopenharmony_ci   II. If all keyword patterns succeed, the class pattern succeeds.
11257db96d56Sopenharmony_ci
11267db96d56Sopenharmony_ci   If any positional patterns are present, they are converted to keyword
11277db96d56Sopenharmony_ci   patterns using the :data:`~object.__match_args__` attribute on the class
11287db96d56Sopenharmony_ci   ``name_or_attr`` before matching:
11297db96d56Sopenharmony_ci
11307db96d56Sopenharmony_ci   I. The equivalent of ``getattr(cls, "__match_args__", ())`` is called.
11317db96d56Sopenharmony_ci
11327db96d56Sopenharmony_ci      * If this raises an exception, the exception bubbles up.
11337db96d56Sopenharmony_ci
11347db96d56Sopenharmony_ci      * If the returned value is not a tuple, the conversion fails and
11357db96d56Sopenharmony_ci        :exc:`TypeError` is raised.
11367db96d56Sopenharmony_ci
11377db96d56Sopenharmony_ci      * If there are more positional patterns than ``len(cls.__match_args__)``,
11387db96d56Sopenharmony_ci        :exc:`TypeError` is raised.
11397db96d56Sopenharmony_ci
11407db96d56Sopenharmony_ci      * Otherwise, positional pattern ``i`` is converted to a keyword pattern
11417db96d56Sopenharmony_ci        using ``__match_args__[i]`` as the keyword.  ``__match_args__[i]`` must
11427db96d56Sopenharmony_ci        be a string; if not :exc:`TypeError` is raised.
11437db96d56Sopenharmony_ci
11447db96d56Sopenharmony_ci      * If there are duplicate keywords, :exc:`TypeError` is raised.
11457db96d56Sopenharmony_ci
11467db96d56Sopenharmony_ci      .. seealso:: :ref:`class-pattern-matching`
11477db96d56Sopenharmony_ci
11487db96d56Sopenharmony_ci   II. Once all positional patterns have been converted to keyword patterns,
11497db96d56Sopenharmony_ci       the match proceeds as if there were only keyword patterns.
11507db96d56Sopenharmony_ci
11517db96d56Sopenharmony_ci   For the following built-in types the handling of positional subpatterns is
11527db96d56Sopenharmony_ci   different:
11537db96d56Sopenharmony_ci
11547db96d56Sopenharmony_ci   * :class:`bool`
11557db96d56Sopenharmony_ci   * :class:`bytearray`
11567db96d56Sopenharmony_ci   * :class:`bytes`
11577db96d56Sopenharmony_ci   * :class:`dict`
11587db96d56Sopenharmony_ci   * :class:`float`
11597db96d56Sopenharmony_ci   * :class:`frozenset`
11607db96d56Sopenharmony_ci   * :class:`int`
11617db96d56Sopenharmony_ci   * :class:`list`
11627db96d56Sopenharmony_ci   * :class:`set`
11637db96d56Sopenharmony_ci   * :class:`str`
11647db96d56Sopenharmony_ci   * :class:`tuple`
11657db96d56Sopenharmony_ci
11667db96d56Sopenharmony_ci   These classes accept a single positional argument, and the pattern there is matched
11677db96d56Sopenharmony_ci   against the whole object rather than an attribute. For example ``int(0|1)`` matches
11687db96d56Sopenharmony_ci   the value ``0``, but not the value ``0.0``.
11697db96d56Sopenharmony_ci
11707db96d56Sopenharmony_ciIn simple terms ``CLS(P1, attr=P2)`` matches only if the following happens:
11717db96d56Sopenharmony_ci
11727db96d56Sopenharmony_ci* ``isinstance(<subject>, CLS)``
11737db96d56Sopenharmony_ci* convert ``P1`` to a keyword pattern using ``CLS.__match_args__``
11747db96d56Sopenharmony_ci* For each keyword argument ``attr=P2``:
11757db96d56Sopenharmony_ci   * ``hasattr(<subject>, "attr")``
11767db96d56Sopenharmony_ci   * ``P2`` matches ``<subject>.attr``
11777db96d56Sopenharmony_ci* ... and so on for the corresponding keyword argument/pattern pair.
11787db96d56Sopenharmony_ci
11797db96d56Sopenharmony_ci.. seealso::
11807db96d56Sopenharmony_ci
11817db96d56Sopenharmony_ci   * :pep:`634` -- Structural Pattern Matching: Specification
11827db96d56Sopenharmony_ci   * :pep:`636` -- Structural Pattern Matching: Tutorial
11837db96d56Sopenharmony_ci
11847db96d56Sopenharmony_ci
11857db96d56Sopenharmony_ci.. index::
11867db96d56Sopenharmony_ci   single: parameter; function definition
11877db96d56Sopenharmony_ci
11887db96d56Sopenharmony_ci.. _function:
11897db96d56Sopenharmony_ci.. _def:
11907db96d56Sopenharmony_ci
11917db96d56Sopenharmony_ciFunction definitions
11927db96d56Sopenharmony_ci====================
11937db96d56Sopenharmony_ci
11947db96d56Sopenharmony_ci.. index::
11957db96d56Sopenharmony_ci   pair: statement; def
11967db96d56Sopenharmony_ci   pair: function; definition
11977db96d56Sopenharmony_ci   pair: function; name
11987db96d56Sopenharmony_ci   pair: name; binding
11997db96d56Sopenharmony_ci   pair: object; user-defined function
12007db96d56Sopenharmony_ci   pair: object; function
12017db96d56Sopenharmony_ci   pair: function; name
12027db96d56Sopenharmony_ci   pair: name; binding
12037db96d56Sopenharmony_ci   single: () (parentheses); function definition
12047db96d56Sopenharmony_ci   single: , (comma); parameter list
12057db96d56Sopenharmony_ci   single: : (colon); compound statement
12067db96d56Sopenharmony_ci
12077db96d56Sopenharmony_ciA function definition defines a user-defined function object (see section
12087db96d56Sopenharmony_ci:ref:`types`):
12097db96d56Sopenharmony_ci
12107db96d56Sopenharmony_ci.. productionlist:: python-grammar
12117db96d56Sopenharmony_ci   funcdef: [`decorators`] "def" `funcname` "(" [`parameter_list`] ")"
12127db96d56Sopenharmony_ci          : ["->" `expression`] ":" `suite`
12137db96d56Sopenharmony_ci   decorators: `decorator`+
12147db96d56Sopenharmony_ci   decorator: "@" `assignment_expression` NEWLINE
12157db96d56Sopenharmony_ci   parameter_list: `defparameter` ("," `defparameter`)* "," "/" ["," [`parameter_list_no_posonly`]]
12167db96d56Sopenharmony_ci                 :   | `parameter_list_no_posonly`
12177db96d56Sopenharmony_ci   parameter_list_no_posonly: `defparameter` ("," `defparameter`)* ["," [`parameter_list_starargs`]]
12187db96d56Sopenharmony_ci                            : | `parameter_list_starargs`
12197db96d56Sopenharmony_ci   parameter_list_starargs: "*" [`parameter`] ("," `defparameter`)* ["," ["**" `parameter` [","]]]
12207db96d56Sopenharmony_ci                          : | "**" `parameter` [","]
12217db96d56Sopenharmony_ci   parameter: `identifier` [":" `expression`]
12227db96d56Sopenharmony_ci   defparameter: `parameter` ["=" `expression`]
12237db96d56Sopenharmony_ci   funcname: `identifier`
12247db96d56Sopenharmony_ci
12257db96d56Sopenharmony_ci
12267db96d56Sopenharmony_ciA function definition is an executable statement.  Its execution binds the
12277db96d56Sopenharmony_cifunction name in the current local namespace to a function object (a wrapper
12287db96d56Sopenharmony_ciaround the executable code for the function).  This function object contains a
12297db96d56Sopenharmony_cireference to the current global namespace as the global namespace to be used
12307db96d56Sopenharmony_ciwhen the function is called.
12317db96d56Sopenharmony_ci
12327db96d56Sopenharmony_ciThe function definition does not execute the function body; this gets executed
12337db96d56Sopenharmony_cionly when the function is called. [#]_
12347db96d56Sopenharmony_ci
12357db96d56Sopenharmony_ci.. index::
12367db96d56Sopenharmony_ci   single: @ (at); function definition
12377db96d56Sopenharmony_ci
12387db96d56Sopenharmony_ciA function definition may be wrapped by one or more :term:`decorator` expressions.
12397db96d56Sopenharmony_ciDecorator expressions are evaluated when the function is defined, in the scope
12407db96d56Sopenharmony_cithat contains the function definition.  The result must be a callable, which is
12417db96d56Sopenharmony_ciinvoked with the function object as the only argument. The returned value is
12427db96d56Sopenharmony_cibound to the function name instead of the function object.  Multiple decorators
12437db96d56Sopenharmony_ciare applied in nested fashion. For example, the following code ::
12447db96d56Sopenharmony_ci
12457db96d56Sopenharmony_ci   @f1(arg)
12467db96d56Sopenharmony_ci   @f2
12477db96d56Sopenharmony_ci   def func(): pass
12487db96d56Sopenharmony_ci
12497db96d56Sopenharmony_ciis roughly equivalent to ::
12507db96d56Sopenharmony_ci
12517db96d56Sopenharmony_ci   def func(): pass
12527db96d56Sopenharmony_ci   func = f1(arg)(f2(func))
12537db96d56Sopenharmony_ci
12547db96d56Sopenharmony_ciexcept that the original function is not temporarily bound to the name ``func``.
12557db96d56Sopenharmony_ci
12567db96d56Sopenharmony_ci.. versionchanged:: 3.9
12577db96d56Sopenharmony_ci   Functions may be decorated with any valid
12587db96d56Sopenharmony_ci   :token:`~python-grammar:assignment_expression`. Previously, the grammar was
12597db96d56Sopenharmony_ci   much more restrictive; see :pep:`614` for details.
12607db96d56Sopenharmony_ci
12617db96d56Sopenharmony_ci.. index::
12627db96d56Sopenharmony_ci   triple: default; parameter; value
12637db96d56Sopenharmony_ci   single: argument; function definition
12647db96d56Sopenharmony_ci   single: = (equals); function definition
12657db96d56Sopenharmony_ci
12667db96d56Sopenharmony_ciWhen one or more :term:`parameters <parameter>` have the form *parameter* ``=``
12677db96d56Sopenharmony_ci*expression*, the function is said to have "default parameter values."  For a
12687db96d56Sopenharmony_ciparameter with a default value, the corresponding :term:`argument` may be
12697db96d56Sopenharmony_ciomitted from a call, in which
12707db96d56Sopenharmony_cicase the parameter's default value is substituted.  If a parameter has a default
12717db96d56Sopenharmony_civalue, all following parameters up until the "``*``" must also have a default
12727db96d56Sopenharmony_civalue --- this is a syntactic restriction that is not expressed by the grammar.
12737db96d56Sopenharmony_ci
12747db96d56Sopenharmony_ci**Default parameter values are evaluated from left to right when the function
12757db96d56Sopenharmony_cidefinition is executed.** This means that the expression is evaluated once, when
12767db96d56Sopenharmony_cithe function is defined, and that the same "pre-computed" value is used for each
12777db96d56Sopenharmony_cicall.  This is especially important to understand when a default parameter value is a
12787db96d56Sopenharmony_cimutable object, such as a list or a dictionary: if the function modifies the
12797db96d56Sopenharmony_ciobject (e.g. by appending an item to a list), the default parameter value is in effect
12807db96d56Sopenharmony_cimodified.  This is generally not what was intended.  A way around this is to use
12817db96d56Sopenharmony_ci``None`` as the default, and explicitly test for it in the body of the function,
12827db96d56Sopenharmony_cie.g.::
12837db96d56Sopenharmony_ci
12847db96d56Sopenharmony_ci   def whats_on_the_telly(penguin=None):
12857db96d56Sopenharmony_ci       if penguin is None:
12867db96d56Sopenharmony_ci           penguin = []
12877db96d56Sopenharmony_ci       penguin.append("property of the zoo")
12887db96d56Sopenharmony_ci       return penguin
12897db96d56Sopenharmony_ci
12907db96d56Sopenharmony_ci.. index::
12917db96d56Sopenharmony_ci   single: / (slash); function definition
12927db96d56Sopenharmony_ci   single: * (asterisk); function definition
12937db96d56Sopenharmony_ci   single: **; function definition
12947db96d56Sopenharmony_ci
12957db96d56Sopenharmony_ciFunction call semantics are described in more detail in section :ref:`calls`. A
12967db96d56Sopenharmony_cifunction call always assigns values to all parameters mentioned in the parameter
12977db96d56Sopenharmony_cilist, either from positional arguments, from keyword arguments, or from default
12987db96d56Sopenharmony_civalues.  If the form "``*identifier``" is present, it is initialized to a tuple
12997db96d56Sopenharmony_cireceiving any excess positional parameters, defaulting to the empty tuple.
13007db96d56Sopenharmony_ciIf the form "``**identifier``" is present, it is initialized to a new
13017db96d56Sopenharmony_ciordered mapping receiving any excess keyword arguments, defaulting to a
13027db96d56Sopenharmony_cinew empty mapping of the same type.  Parameters after "``*``" or
13037db96d56Sopenharmony_ci"``*identifier``" are keyword-only parameters and may only be passed
13047db96d56Sopenharmony_ciby keyword arguments.  Parameters before "``/``" are positional-only parameters
13057db96d56Sopenharmony_ciand may only be passed by positional arguments.
13067db96d56Sopenharmony_ci
13077db96d56Sopenharmony_ci.. versionchanged:: 3.8
13087db96d56Sopenharmony_ci   The ``/`` function parameter syntax may be used to indicate positional-only
13097db96d56Sopenharmony_ci   parameters. See :pep:`570` for details.
13107db96d56Sopenharmony_ci
13117db96d56Sopenharmony_ci.. index::
13127db96d56Sopenharmony_ci   pair: function; annotations
13137db96d56Sopenharmony_ci   single: ->; function annotations
13147db96d56Sopenharmony_ci   single: : (colon); function annotations
13157db96d56Sopenharmony_ci
13167db96d56Sopenharmony_ciParameters may have an :term:`annotation <function annotation>` of the form "``: expression``"
13177db96d56Sopenharmony_cifollowing the parameter name.  Any parameter may have an annotation, even those of the form
13187db96d56Sopenharmony_ci``*identifier`` or ``**identifier``.  Functions may have "return" annotation of
13197db96d56Sopenharmony_cithe form "``-> expression``" after the parameter list.  These annotations can be
13207db96d56Sopenharmony_ciany valid Python expression.  The presence of annotations does not change the
13217db96d56Sopenharmony_cisemantics of a function.  The annotation values are available as values of
13227db96d56Sopenharmony_cia dictionary keyed by the parameters' names in the :attr:`__annotations__`
13237db96d56Sopenharmony_ciattribute of the function object.  If the ``annotations`` import from
13247db96d56Sopenharmony_ci:mod:`__future__` is used, annotations are preserved as strings at runtime which
13257db96d56Sopenharmony_cienables postponed evaluation.  Otherwise, they are evaluated when the function
13267db96d56Sopenharmony_cidefinition is executed.  In this case annotations may be evaluated in
13277db96d56Sopenharmony_cia different order than they appear in the source code.
13287db96d56Sopenharmony_ci
13297db96d56Sopenharmony_ci.. index:: pair: lambda; expression
13307db96d56Sopenharmony_ci
13317db96d56Sopenharmony_ciIt is also possible to create anonymous functions (functions not bound to a
13327db96d56Sopenharmony_ciname), for immediate use in expressions.  This uses lambda expressions, described in
13337db96d56Sopenharmony_cisection :ref:`lambda`.  Note that the lambda expression is merely a shorthand for a
13347db96d56Sopenharmony_cisimplified function definition; a function defined in a ":keyword:`def`"
13357db96d56Sopenharmony_cistatement can be passed around or assigned to another name just like a function
13367db96d56Sopenharmony_cidefined by a lambda expression.  The ":keyword:`!def`" form is actually more powerful
13377db96d56Sopenharmony_cisince it allows the execution of multiple statements and annotations.
13387db96d56Sopenharmony_ci
13397db96d56Sopenharmony_ci**Programmer's note:** Functions are first-class objects.  A "``def``" statement
13407db96d56Sopenharmony_ciexecuted inside a function definition defines a local function that can be
13417db96d56Sopenharmony_cireturned or passed around.  Free variables used in the nested function can
13427db96d56Sopenharmony_ciaccess the local variables of the function containing the def.  See section
13437db96d56Sopenharmony_ci:ref:`naming` for details.
13447db96d56Sopenharmony_ci
13457db96d56Sopenharmony_ci.. seealso::
13467db96d56Sopenharmony_ci
13477db96d56Sopenharmony_ci   :pep:`3107` - Function Annotations
13487db96d56Sopenharmony_ci      The original specification for function annotations.
13497db96d56Sopenharmony_ci
13507db96d56Sopenharmony_ci   :pep:`484` - Type Hints
13517db96d56Sopenharmony_ci      Definition of a standard meaning for annotations: type hints.
13527db96d56Sopenharmony_ci
13537db96d56Sopenharmony_ci   :pep:`526` - Syntax for Variable Annotations
13547db96d56Sopenharmony_ci      Ability to type hint variable declarations, including class
13557db96d56Sopenharmony_ci      variables and instance variables
13567db96d56Sopenharmony_ci
13577db96d56Sopenharmony_ci   :pep:`563` - Postponed Evaluation of Annotations
13587db96d56Sopenharmony_ci      Support for forward references within annotations by preserving
13597db96d56Sopenharmony_ci      annotations in a string form at runtime instead of eager evaluation.
13607db96d56Sopenharmony_ci
13617db96d56Sopenharmony_ci
13627db96d56Sopenharmony_ci.. _class:
13637db96d56Sopenharmony_ci
13647db96d56Sopenharmony_ciClass definitions
13657db96d56Sopenharmony_ci=================
13667db96d56Sopenharmony_ci
13677db96d56Sopenharmony_ci.. index::
13687db96d56Sopenharmony_ci   pair: object; class
13697db96d56Sopenharmony_ci   pair: statement; class
13707db96d56Sopenharmony_ci   pair: class; definition
13717db96d56Sopenharmony_ci   pair: class; name
13727db96d56Sopenharmony_ci   pair: name; binding
13737db96d56Sopenharmony_ci   pair: execution; frame
13747db96d56Sopenharmony_ci   single: inheritance
13757db96d56Sopenharmony_ci   single: docstring
13767db96d56Sopenharmony_ci   single: () (parentheses); class definition
13777db96d56Sopenharmony_ci   single: , (comma); expression list
13787db96d56Sopenharmony_ci   single: : (colon); compound statement
13797db96d56Sopenharmony_ci
13807db96d56Sopenharmony_ciA class definition defines a class object (see section :ref:`types`):
13817db96d56Sopenharmony_ci
13827db96d56Sopenharmony_ci.. productionlist:: python-grammar
13837db96d56Sopenharmony_ci   classdef: [`decorators`] "class" `classname` [`inheritance`] ":" `suite`
13847db96d56Sopenharmony_ci   inheritance: "(" [`argument_list`] ")"
13857db96d56Sopenharmony_ci   classname: `identifier`
13867db96d56Sopenharmony_ci
13877db96d56Sopenharmony_ciA class definition is an executable statement.  The inheritance list usually
13887db96d56Sopenharmony_cigives a list of base classes (see :ref:`metaclasses` for more advanced uses), so
13897db96d56Sopenharmony_cieach item in the list should evaluate to a class object which allows
13907db96d56Sopenharmony_cisubclassing.  Classes without an inheritance list inherit, by default, from the
13917db96d56Sopenharmony_cibase class :class:`object`; hence, ::
13927db96d56Sopenharmony_ci
13937db96d56Sopenharmony_ci   class Foo:
13947db96d56Sopenharmony_ci       pass
13957db96d56Sopenharmony_ci
13967db96d56Sopenharmony_ciis equivalent to ::
13977db96d56Sopenharmony_ci
13987db96d56Sopenharmony_ci   class Foo(object):
13997db96d56Sopenharmony_ci       pass
14007db96d56Sopenharmony_ci
14017db96d56Sopenharmony_ciThe class's suite is then executed in a new execution frame (see :ref:`naming`),
14027db96d56Sopenharmony_ciusing a newly created local namespace and the original global namespace.
14037db96d56Sopenharmony_ci(Usually, the suite contains mostly function definitions.)  When the class's
14047db96d56Sopenharmony_cisuite finishes execution, its execution frame is discarded but its local
14057db96d56Sopenharmony_cinamespace is saved. [#]_ A class object is then created using the inheritance
14067db96d56Sopenharmony_cilist for the base classes and the saved local namespace for the attribute
14077db96d56Sopenharmony_cidictionary.  The class name is bound to this class object in the original local
14087db96d56Sopenharmony_cinamespace.
14097db96d56Sopenharmony_ci
14107db96d56Sopenharmony_ciThe order in which attributes are defined in the class body is preserved
14117db96d56Sopenharmony_ciin the new class's ``__dict__``.  Note that this is reliable only right
14127db96d56Sopenharmony_ciafter the class is created and only for classes that were defined using
14137db96d56Sopenharmony_cithe definition syntax.
14147db96d56Sopenharmony_ci
14157db96d56Sopenharmony_ciClass creation can be customized heavily using :ref:`metaclasses <metaclasses>`.
14167db96d56Sopenharmony_ci
14177db96d56Sopenharmony_ci.. index::
14187db96d56Sopenharmony_ci   single: @ (at); class definition
14197db96d56Sopenharmony_ci
14207db96d56Sopenharmony_ciClasses can also be decorated: just like when decorating functions, ::
14217db96d56Sopenharmony_ci
14227db96d56Sopenharmony_ci   @f1(arg)
14237db96d56Sopenharmony_ci   @f2
14247db96d56Sopenharmony_ci   class Foo: pass
14257db96d56Sopenharmony_ci
14267db96d56Sopenharmony_ciis roughly equivalent to ::
14277db96d56Sopenharmony_ci
14287db96d56Sopenharmony_ci   class Foo: pass
14297db96d56Sopenharmony_ci   Foo = f1(arg)(f2(Foo))
14307db96d56Sopenharmony_ci
14317db96d56Sopenharmony_ciThe evaluation rules for the decorator expressions are the same as for function
14327db96d56Sopenharmony_cidecorators.  The result is then bound to the class name.
14337db96d56Sopenharmony_ci
14347db96d56Sopenharmony_ci.. versionchanged:: 3.9
14357db96d56Sopenharmony_ci   Classes may be decorated with any valid
14367db96d56Sopenharmony_ci   :token:`~python-grammar:assignment_expression`. Previously, the grammar was
14377db96d56Sopenharmony_ci   much more restrictive; see :pep:`614` for details.
14387db96d56Sopenharmony_ci
14397db96d56Sopenharmony_ci**Programmer's note:** Variables defined in the class definition are class
14407db96d56Sopenharmony_ciattributes; they are shared by instances.  Instance attributes can be set in a
14417db96d56Sopenharmony_cimethod with ``self.name = value``.  Both class and instance attributes are
14427db96d56Sopenharmony_ciaccessible through the notation "``self.name``", and an instance attribute hides
14437db96d56Sopenharmony_cia class attribute with the same name when accessed in this way.  Class
14447db96d56Sopenharmony_ciattributes can be used as defaults for instance attributes, but using mutable
14457db96d56Sopenharmony_civalues there can lead to unexpected results.  :ref:`Descriptors <descriptors>`
14467db96d56Sopenharmony_cican be used to create instance variables with different implementation details.
14477db96d56Sopenharmony_ci
14487db96d56Sopenharmony_ci
14497db96d56Sopenharmony_ci.. seealso::
14507db96d56Sopenharmony_ci
14517db96d56Sopenharmony_ci   :pep:`3115` - Metaclasses in Python 3000
14527db96d56Sopenharmony_ci      The proposal that changed the declaration of metaclasses to the current
14537db96d56Sopenharmony_ci      syntax, and the semantics for how classes with metaclasses are
14547db96d56Sopenharmony_ci      constructed.
14557db96d56Sopenharmony_ci
14567db96d56Sopenharmony_ci   :pep:`3129` - Class Decorators
14577db96d56Sopenharmony_ci      The proposal that added class decorators.  Function and method decorators
14587db96d56Sopenharmony_ci      were introduced in :pep:`318`.
14597db96d56Sopenharmony_ci
14607db96d56Sopenharmony_ci
14617db96d56Sopenharmony_ci.. _async:
14627db96d56Sopenharmony_ci
14637db96d56Sopenharmony_ciCoroutines
14647db96d56Sopenharmony_ci==========
14657db96d56Sopenharmony_ci
14667db96d56Sopenharmony_ci.. versionadded:: 3.5
14677db96d56Sopenharmony_ci
14687db96d56Sopenharmony_ci.. index:: pair: statement; async def
14697db96d56Sopenharmony_ci.. _`async def`:
14707db96d56Sopenharmony_ci
14717db96d56Sopenharmony_ciCoroutine function definition
14727db96d56Sopenharmony_ci-----------------------------
14737db96d56Sopenharmony_ci
14747db96d56Sopenharmony_ci.. productionlist:: python-grammar
14757db96d56Sopenharmony_ci   async_funcdef: [`decorators`] "async" "def" `funcname` "(" [`parameter_list`] ")"
14767db96d56Sopenharmony_ci                : ["->" `expression`] ":" `suite`
14777db96d56Sopenharmony_ci
14787db96d56Sopenharmony_ci.. index::
14797db96d56Sopenharmony_ci   pair: keyword; async
14807db96d56Sopenharmony_ci   pair: keyword; await
14817db96d56Sopenharmony_ci
14827db96d56Sopenharmony_ciExecution of Python coroutines can be suspended and resumed at many points
14837db96d56Sopenharmony_ci(see :term:`coroutine`). :keyword:`await` expressions, :keyword:`async for` and
14847db96d56Sopenharmony_ci:keyword:`async with` can only be used in the body of a coroutine function.
14857db96d56Sopenharmony_ci
14867db96d56Sopenharmony_ciFunctions defined with ``async def`` syntax are always coroutine functions,
14877db96d56Sopenharmony_cieven if they do not contain ``await`` or ``async`` keywords.
14887db96d56Sopenharmony_ci
14897db96d56Sopenharmony_ciIt is a :exc:`SyntaxError` to use a ``yield from`` expression inside the body
14907db96d56Sopenharmony_ciof a coroutine function.
14917db96d56Sopenharmony_ci
14927db96d56Sopenharmony_ciAn example of a coroutine function::
14937db96d56Sopenharmony_ci
14947db96d56Sopenharmony_ci    async def func(param1, param2):
14957db96d56Sopenharmony_ci        do_stuff()
14967db96d56Sopenharmony_ci        await some_coroutine()
14977db96d56Sopenharmony_ci
14987db96d56Sopenharmony_ci.. versionchanged:: 3.7
14997db96d56Sopenharmony_ci   ``await`` and ``async`` are now keywords; previously they were only
15007db96d56Sopenharmony_ci   treated as such inside the body of a coroutine function.
15017db96d56Sopenharmony_ci
15027db96d56Sopenharmony_ci.. index:: pair: statement; async for
15037db96d56Sopenharmony_ci.. _`async for`:
15047db96d56Sopenharmony_ci
15057db96d56Sopenharmony_ciThe :keyword:`!async for` statement
15067db96d56Sopenharmony_ci-----------------------------------
15077db96d56Sopenharmony_ci
15087db96d56Sopenharmony_ci.. productionlist:: python-grammar
15097db96d56Sopenharmony_ci   async_for_stmt: "async" `for_stmt`
15107db96d56Sopenharmony_ci
15117db96d56Sopenharmony_ciAn :term:`asynchronous iterable` provides an ``__aiter__`` method that directly
15127db96d56Sopenharmony_cireturns an :term:`asynchronous iterator`, which can call asynchronous code in
15137db96d56Sopenharmony_ciits ``__anext__`` method.
15147db96d56Sopenharmony_ci
15157db96d56Sopenharmony_ciThe ``async for`` statement allows convenient iteration over asynchronous
15167db96d56Sopenharmony_ciiterables.
15177db96d56Sopenharmony_ci
15187db96d56Sopenharmony_ciThe following code::
15197db96d56Sopenharmony_ci
15207db96d56Sopenharmony_ci    async for TARGET in ITER:
15217db96d56Sopenharmony_ci        SUITE
15227db96d56Sopenharmony_ci    else:
15237db96d56Sopenharmony_ci        SUITE2
15247db96d56Sopenharmony_ci
15257db96d56Sopenharmony_ciIs semantically equivalent to::
15267db96d56Sopenharmony_ci
15277db96d56Sopenharmony_ci    iter = (ITER)
15287db96d56Sopenharmony_ci    iter = type(iter).__aiter__(iter)
15297db96d56Sopenharmony_ci    running = True
15307db96d56Sopenharmony_ci
15317db96d56Sopenharmony_ci    while running:
15327db96d56Sopenharmony_ci        try:
15337db96d56Sopenharmony_ci            TARGET = await type(iter).__anext__(iter)
15347db96d56Sopenharmony_ci        except StopAsyncIteration:
15357db96d56Sopenharmony_ci            running = False
15367db96d56Sopenharmony_ci        else:
15377db96d56Sopenharmony_ci            SUITE
15387db96d56Sopenharmony_ci    else:
15397db96d56Sopenharmony_ci        SUITE2
15407db96d56Sopenharmony_ci
15417db96d56Sopenharmony_ciSee also :meth:`~object.__aiter__` and :meth:`~object.__anext__` for details.
15427db96d56Sopenharmony_ci
15437db96d56Sopenharmony_ciIt is a :exc:`SyntaxError` to use an ``async for`` statement outside the
15447db96d56Sopenharmony_cibody of a coroutine function.
15457db96d56Sopenharmony_ci
15467db96d56Sopenharmony_ci
15477db96d56Sopenharmony_ci.. index:: pair: statement; async with
15487db96d56Sopenharmony_ci.. _`async with`:
15497db96d56Sopenharmony_ci
15507db96d56Sopenharmony_ciThe :keyword:`!async with` statement
15517db96d56Sopenharmony_ci------------------------------------
15527db96d56Sopenharmony_ci
15537db96d56Sopenharmony_ci.. productionlist:: python-grammar
15547db96d56Sopenharmony_ci   async_with_stmt: "async" `with_stmt`
15557db96d56Sopenharmony_ci
15567db96d56Sopenharmony_ciAn :term:`asynchronous context manager` is a :term:`context manager` that is
15577db96d56Sopenharmony_ciable to suspend execution in its *enter* and *exit* methods.
15587db96d56Sopenharmony_ci
15597db96d56Sopenharmony_ciThe following code::
15607db96d56Sopenharmony_ci
15617db96d56Sopenharmony_ci    async with EXPRESSION as TARGET:
15627db96d56Sopenharmony_ci        SUITE
15637db96d56Sopenharmony_ci
15647db96d56Sopenharmony_ciis semantically equivalent to::
15657db96d56Sopenharmony_ci
15667db96d56Sopenharmony_ci    manager = (EXPRESSION)
15677db96d56Sopenharmony_ci    aenter = type(manager).__aenter__
15687db96d56Sopenharmony_ci    aexit = type(manager).__aexit__
15697db96d56Sopenharmony_ci    value = await aenter(manager)
15707db96d56Sopenharmony_ci    hit_except = False
15717db96d56Sopenharmony_ci
15727db96d56Sopenharmony_ci    try:
15737db96d56Sopenharmony_ci        TARGET = value
15747db96d56Sopenharmony_ci        SUITE
15757db96d56Sopenharmony_ci    except:
15767db96d56Sopenharmony_ci        hit_except = True
15777db96d56Sopenharmony_ci        if not await aexit(manager, *sys.exc_info()):
15787db96d56Sopenharmony_ci            raise
15797db96d56Sopenharmony_ci    finally:
15807db96d56Sopenharmony_ci        if not hit_except:
15817db96d56Sopenharmony_ci            await aexit(manager, None, None, None)
15827db96d56Sopenharmony_ci
15837db96d56Sopenharmony_ciSee also :meth:`~object.__aenter__` and :meth:`~object.__aexit__` for details.
15847db96d56Sopenharmony_ci
15857db96d56Sopenharmony_ciIt is a :exc:`SyntaxError` to use an ``async with`` statement outside the
15867db96d56Sopenharmony_cibody of a coroutine function.
15877db96d56Sopenharmony_ci
15887db96d56Sopenharmony_ci.. seealso::
15897db96d56Sopenharmony_ci
15907db96d56Sopenharmony_ci   :pep:`492` - Coroutines with async and await syntax
15917db96d56Sopenharmony_ci      The proposal that made coroutines a proper standalone concept in Python,
15927db96d56Sopenharmony_ci      and added supporting syntax.
15937db96d56Sopenharmony_ci
15947db96d56Sopenharmony_ci
15957db96d56Sopenharmony_ci.. rubric:: Footnotes
15967db96d56Sopenharmony_ci
15977db96d56Sopenharmony_ci.. [#] The exception is propagated to the invocation stack unless
15987db96d56Sopenharmony_ci   there is a :keyword:`finally` clause which happens to raise another
15997db96d56Sopenharmony_ci   exception. That new exception causes the old one to be lost.
16007db96d56Sopenharmony_ci
16017db96d56Sopenharmony_ci.. [#] In pattern matching, a sequence is defined as one of the following:
16027db96d56Sopenharmony_ci
16037db96d56Sopenharmony_ci      * a class that inherits from :class:`collections.abc.Sequence`
16047db96d56Sopenharmony_ci      * a Python class that has been registered as :class:`collections.abc.Sequence`
16057db96d56Sopenharmony_ci      * a builtin class that has its (CPython) :data:`Py_TPFLAGS_SEQUENCE` bit set
16067db96d56Sopenharmony_ci      * a class that inherits from any of the above
16077db96d56Sopenharmony_ci
16087db96d56Sopenharmony_ci   The following standard library classes are sequences:
16097db96d56Sopenharmony_ci
16107db96d56Sopenharmony_ci      * :class:`array.array`
16117db96d56Sopenharmony_ci      * :class:`collections.deque`
16127db96d56Sopenharmony_ci      * :class:`list`
16137db96d56Sopenharmony_ci      * :class:`memoryview`
16147db96d56Sopenharmony_ci      * :class:`range`
16157db96d56Sopenharmony_ci      * :class:`tuple`
16167db96d56Sopenharmony_ci
16177db96d56Sopenharmony_ci   .. note:: Subject values of type ``str``, ``bytes``, and ``bytearray``
16187db96d56Sopenharmony_ci      do not match sequence patterns.
16197db96d56Sopenharmony_ci
16207db96d56Sopenharmony_ci.. [#] In pattern matching, a mapping is defined as one of the following:
16217db96d56Sopenharmony_ci
16227db96d56Sopenharmony_ci      * a class that inherits from :class:`collections.abc.Mapping`
16237db96d56Sopenharmony_ci      * a Python class that has been registered as :class:`collections.abc.Mapping`
16247db96d56Sopenharmony_ci      * a builtin class that has its (CPython) :data:`Py_TPFLAGS_MAPPING` bit set
16257db96d56Sopenharmony_ci      * a class that inherits from any of the above
16267db96d56Sopenharmony_ci
16277db96d56Sopenharmony_ci   The standard library classes :class:`dict` and :class:`types.MappingProxyType`
16287db96d56Sopenharmony_ci   are mappings.
16297db96d56Sopenharmony_ci
16307db96d56Sopenharmony_ci.. [#] A string literal appearing as the first statement in the function body is
16317db96d56Sopenharmony_ci   transformed into the function's ``__doc__`` attribute and therefore the
16327db96d56Sopenharmony_ci   function's :term:`docstring`.
16337db96d56Sopenharmony_ci
16347db96d56Sopenharmony_ci.. [#] A string literal appearing as the first statement in the class body is
16357db96d56Sopenharmony_ci   transformed into the namespace's ``__doc__`` item and therefore the class's
16367db96d56Sopenharmony_ci   :term:`docstring`.
1637