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