diff options
Diffstat (limited to 'Doc/ref/ref7.tex')
-rw-r--r-- | Doc/ref/ref7.tex | 552 |
1 files changed, 0 insertions, 552 deletions
diff --git a/Doc/ref/ref7.tex b/Doc/ref/ref7.tex deleted file mode 100644 index 9294557..0000000 --- a/Doc/ref/ref7.tex +++ /dev/null @@ -1,552 +0,0 @@ -\chapter{Compound statements\label{compound}} -\indexii{compound}{statement} - -Compound statements contain (groups of) other statements; they affect -or control the execution of those other statements in some way. In -general, compound statements span multiple lines, although in simple -incarnations a whole compound statement may be contained in one line. - -The \keyword{if}, \keyword{while} and \keyword{for} statements implement -traditional control flow constructs. \keyword{try} specifies exception -handlers and/or cleanup code for a group of statements. Function and -class definitions are also syntactically compound statements. - -Compound statements consist of one or more `clauses.' A clause -consists of a header and a `suite.' The clause headers of a -particular compound statement are all at the same indentation level. -Each clause header begins with a uniquely identifying keyword and ends -with a colon. A suite is a group of statements controlled by a -clause. A suite can be one or more semicolon-separated simple -statements on the same line as the header, following the header's -colon, or it can be one or more indented statements on subsequent -lines. Only the latter form of suite can contain nested compound -statements; the following is illegal, mostly because it wouldn't be -clear to which \keyword{if} clause a following \keyword{else} clause would -belong: -\index{clause} -\index{suite} - -\begin{verbatim} -if test1: if test2: print x -\end{verbatim} - -Also note that the semicolon binds tighter than the colon in this -context, so that in the following example, either all or none of the -\keyword{print} statements are executed: - -\begin{verbatim} -if x < y < z: print x; print y; print z -\end{verbatim} - -Summarizing: - -\begin{productionlist} - \production{compound_stmt} - {\token{if_stmt}} - \productioncont{| \token{while_stmt}} - \productioncont{| \token{for_stmt}} - \productioncont{| \token{try_stmt}} - \productioncont{| \token{with_stmt}} - \productioncont{| \token{funcdef}} - \productioncont{| \token{classdef}} - \production{suite} - {\token{stmt_list} NEWLINE - | NEWLINE INDENT \token{statement}+ DEDENT} - \production{statement} - {\token{stmt_list} NEWLINE | \token{compound_stmt}} - \production{stmt_list} - {\token{simple_stmt} (";" \token{simple_stmt})* [";"]} -\end{productionlist} - -Note that statements always end in a -\code{NEWLINE}\index{NEWLINE token} possibly followed by a -\code{DEDENT}.\index{DEDENT token} Also note that optional -continuation clauses always begin with a keyword that cannot start a -statement, thus there are no ambiguities (the `dangling -\keyword{else}' problem is solved in Python by requiring nested -\keyword{if} statements to be indented). -\indexii{dangling}{else} - -The formatting of the grammar rules in the following sections places -each clause on a separate line for clarity. - - -\section{The \keyword{if} statement\label{if}} -\stindex{if} - -The \keyword{if} statement is used for conditional execution: - -\begin{productionlist} - \production{if_stmt} - {"if" \token{expression} ":" \token{suite}} - \productioncont{( "elif" \token{expression} ":" \token{suite} )*} - \productioncont{["else" ":" \token{suite}]} -\end{productionlist} - -It selects exactly one of the suites by evaluating the expressions one -by one until one is found to be true (see section~\ref{Booleans} for -the definition of true and false); then that suite is executed (and no -other part of the \keyword{if} statement is executed or evaluated). If -all expressions are false, the suite of the \keyword{else} clause, if -present, is executed. -\kwindex{elif} -\kwindex{else} - - -\section{The \keyword{while} statement\label{while}} -\stindex{while} -\indexii{loop}{statement} - -The \keyword{while} statement is used for repeated execution as long -as an expression is true: - -\begin{productionlist} - \production{while_stmt} - {"while" \token{expression} ":" \token{suite}} - \productioncont{["else" ":" \token{suite}]} -\end{productionlist} - -This repeatedly tests the expression and, if it is true, executes the -first suite; if the expression is false (which may be the first time it -is tested) the suite of the \keyword{else} clause, if present, is -executed and the loop terminates. -\kwindex{else} - -A \keyword{break} statement executed in the first suite terminates the -loop without executing the \keyword{else} clause's suite. A -\keyword{continue} statement executed in the first suite skips the rest -of the suite and goes back to testing the expression. -\stindex{break} -\stindex{continue} - - -\section{The \keyword{for} statement\label{for}} -\stindex{for} -\indexii{loop}{statement} - -The \keyword{for} statement is used to iterate over the elements of a -sequence (such as a string, tuple or list) or other iterable object: -\obindex{sequence} - -\begin{productionlist} - \production{for_stmt} - {"for" \token{target_list} "in" \token{expression_list} - ":" \token{suite}} - \productioncont{["else" ":" \token{suite}]} -\end{productionlist} - -The expression list is evaluated once; it should yield an iterable -object. An iterator is created for the result of the -{}\code{expression_list}. The suite is then executed once for each -item provided by the iterator, in the -order of ascending indices. Each item in turn is assigned to the -target list using the standard rules for assignments, and then the -suite is executed. When the items are exhausted (which is immediately -when the sequence is empty), the suite in the \keyword{else} clause, if -present, is executed, and the loop terminates. -\kwindex{in} -\kwindex{else} -\indexii{target}{list} - -A \keyword{break} statement executed in the first suite terminates the -loop without executing the \keyword{else} clause's suite. A -\keyword{continue} statement executed in the first suite skips the rest -of the suite and continues with the next item, or with the \keyword{else} -clause if there was no next item. -\stindex{break} -\stindex{continue} - -The suite may assign to the variable(s) in the target list; this does -not affect the next item assigned to it. - -The target list is not deleted when the loop is finished, but if the -sequence is empty, it will not have been assigned to at all by the -loop. Hint: the built-in function \function{range()} returns a -sequence of integers suitable to emulate the effect of Pascal's -\code{for i := a to b do}; -e.g., \code{range(3)} returns the list \code{[0, 1, 2]}. -\bifuncindex{range} -\indexii{Pascal}{language} - -\warning{There is a subtlety when the sequence is being modified -by the loop (this can only occur for mutable sequences, i.e. lists). -An internal counter is used to keep track of which item is used next, -and this is incremented on each iteration. When this counter has -reached the length of the sequence the loop terminates. This means that -if the suite deletes the current (or a previous) item from the -sequence, the next item will be skipped (since it gets the index of -the current item which has already been treated). Likewise, if the -suite inserts an item in the sequence before the current item, the -current item will be treated again the next time through the loop. -This can lead to nasty bugs that can be avoided by making a temporary -copy using a slice of the whole sequence, e.g., -\index{loop!over mutable sequence} -\index{mutable sequence!loop over}} - -\begin{verbatim} -for x in a[:]: - if x < 0: a.remove(x) -\end{verbatim} - - -\section{The \keyword{try} statement\label{try}} -\stindex{try} - -The \keyword{try} statement specifies exception handlers and/or cleanup -code for a group of statements: - -\begin{productionlist} - \production{try_stmt} {try1_stmt | try2_stmt} - \production{try1_stmt} - {"try" ":" \token{suite}} - \productioncont{("except" [\token{expression} - ["," \token{target}]] ":" \token{suite})+} - \productioncont{["else" ":" \token{suite}]} - \productioncont{["finally" ":" \token{suite}]} - \production{try2_stmt} - {"try" ":" \token{suite}} - \productioncont{"finally" ":" \token{suite}} -\end{productionlist} - -\versionchanged[In previous versions of Python, -\keyword{try}...\keyword{except}...\keyword{finally} did not work. -\keyword{try}...\keyword{except} had to be nested in -\keyword{try}...\keyword{finally}]{2.5} - -The \keyword{except} clause(s) specify one or more exception handlers. -When no exception occurs in the -\keyword{try} clause, no exception handler is executed. When an -exception occurs in the \keyword{try} suite, a search for an exception -handler is started. This search inspects the except clauses in turn until -one is found that matches the exception. An expression-less except -clause, if present, must be last; it matches any exception. For an -except clause with an expression, that expression is evaluated, and the -clause matches the exception if the resulting object is ``compatible'' -with the exception. An object is compatible with an exception if it -is the class or a base class of the exception object, a tuple -containing an item compatible with the exception, or, in the -(deprecated) case of string exceptions, is the raised string itself -(note that the object identities must match, i.e. it must be the same -string object, not just a string with the same value). -\kwindex{except} - -If no except clause matches the exception, the search for an exception -handler continues in the surrounding code and on the invocation stack. -\footnote{The exception is propogated to the invocation stack only if -there is no \keyword{finally} clause that negates the exception.} - -If the evaluation of an expression in the header of an except clause -raises an exception, the original search for a handler is canceled -and a search starts for the new exception in the surrounding code and -on the call stack (it is treated as if the entire \keyword{try} statement -raised the exception). - -When a matching except clause is found, the exception is assigned to -the target specified in that except clause, if present, and the except -clause's suite is executed. All except clauses must have an -executable block. When the end of this block is reached, execution -continues normally after the entire try statement. (This means that -if two nested handlers exist for the same exception, and the exception -occurs in the try clause of the inner handler, the outer handler will -not handle the exception.) - -Before an except clause's suite is executed, details about the -exception are stored in the \module{sys}\refbimodindex{sys} module -and can be access via \function{sys.exc_info()}. \function{sys.exc_info()} -returns a 3-tuple consisting of: \code{exc_type} receives -the object identifying the exception; \code{exc_value} receives -the exception's parameter; \code{exc_traceback} receives a -traceback object\obindex{traceback} (see section~\ref{traceback}) -identifying the point in the program where the exception occurred. -\function{sys.exc_info()} values are restored to their previous values -(before the call) when returning from a function that handled an exception. - -The optional \keyword{else} clause is executed if and when control -flows off the end of the \keyword{try} clause.\footnote{ - Currently, control ``flows off the end'' except in the case of an - exception or the execution of a \keyword{return}, - \keyword{continue}, or \keyword{break} statement. -} Exceptions in the \keyword{else} clause are not handled by the -preceding \keyword{except} clauses. -\kwindex{else} -\stindex{return} -\stindex{break} -\stindex{continue} - -If \keyword{finally} is present, it specifies a `cleanup' handler. The -\keyword{try} clause is executed, including any \keyword{except} and -\keyword{else} clauses. If an exception occurs in any of the clauses -and is not handled, the exception is temporarily saved. The -\keyword{finally} clause is executed. If there is a saved exception, -it is re-raised at the end of the \keyword{finally} clause. -If the \keyword{finally} clause raises another exception or -executes a \keyword{return} or \keyword{break} statement, the saved -exception is lost. The exception information is not available to the -program during execution of the \keyword{finally} clause. -\kwindex{finally} - -When a \keyword{return}, \keyword{break} or \keyword{continue} statement is -executed in the \keyword{try} suite of a \keyword{try}...\keyword{finally} -statement, the \keyword{finally} clause is also executed `on the way out.' A -\keyword{continue} statement is illegal in the \keyword{finally} clause. -(The reason is a problem with the current implementation --- this -restriction may be lifted in the future). -\stindex{return} -\stindex{break} -\stindex{continue} - -Additional information on exceptions can be found in -section~\ref{exceptions}, and information on using the \keyword{raise} -statement to generate exceptions may be found in section~\ref{raise}. - - -\section{The \keyword{with} statement\label{with}} -\stindex{with} - -\versionadded{2.5} - -The \keyword{with} statement is used to wrap the execution of a block -with methods defined by a context manager (see -section~\ref{context-managers}). This allows common -\keyword{try}...\keyword{except}...\keyword{finally} usage patterns to -be encapsulated for convenient reuse. - -\begin{productionlist} - \production{with_stmt} - {"with" \token{expression} ["as" \token{target}] ":" \token{suite}} -\end{productionlist} - -The execution of the \keyword{with} statement proceeds as follows: - -\begin{enumerate} - -\item The context expression is evaluated to obtain a context manager. - -\item The context manager's \method{__enter__()} method is invoked. - -\item If a target was included in the \keyword{with} -statement, the return value from \method{__enter__()} is assigned to it. - -\note{The \keyword{with} statement guarantees that if the -\method{__enter__()} method returns without an error, then -\method{__exit__()} will always be called. Thus, if an error occurs -during the assignment to the target list, it will be treated the same as -an error occurring within the suite would be. See step 5 below.} - -\item The suite is executed. - -\item The context manager's \method{__exit__()} method is invoked. If -an exception caused the suite to be exited, its type, value, and -traceback are passed as arguments to \method{__exit__()}. Otherwise, -three \constant{None} arguments are supplied. - -If the suite was exited due to an exception, and the return -value from the \method{__exit__()} method was false, the exception is -reraised. If the return value was true, the exception is suppressed, and -execution continues with the statement following the \keyword{with} -statement. - -If the suite was exited for any reason other than an exception, the -return value from \method{__exit__()} is ignored, and execution proceeds -at the normal location for the kind of exit that was taken. - -\end{enumerate} - -\begin{notice} -In Python 2.5, the \keyword{with} statement is only allowed -when the \code{with_statement} feature has been enabled. It will always -be enabled in Python 2.6. This \code{__future__} import statement can -be used to enable the feature: - -\begin{verbatim} -from __future__ import with_statement -\end{verbatim} -\end{notice} - -\begin{seealso} - \seepep{0343}{The "with" statement} - {The specification, background, and examples for the - Python \keyword{with} statement.} -\end{seealso} - -\section{Function definitions\label{function}} -\indexii{function}{definition} -\stindex{def} - -A function definition defines a user-defined function object (see -section~\ref{types}): -\obindex{user-defined function} -\obindex{function} - -\begin{productionlist} - \production{funcdef} - {[\token{decorators}] "def" \token{funcname} "(" [\token{parameter_list}] ")" - ["->" \token{expression}]? - ":" \token{suite}} - \production{decorators} - {\token{decorator}+} - \production{decorator} - {"@" \token{dotted_name} ["(" [\token{argument_list} [","]] ")"] NEWLINE} - \production{dotted_name} - {\token{identifier} ("." \token{identifier})*} - \production{parameter_list} - {(\token{defparameter} ",")*} - \productioncont{(~~"*" [\token{parameter}] ("," \token{defparameter})*} - \productioncont{ [, "**" \token{parameter}]} - \productioncont{ | "**" \token{parameter}} - \productioncont{ | \token{defparameter} [","] )} - \production{parameter} - {\token{identifier} [":" \token{expression}]} - \production{defparameter} - {\token{parameter} ["=" \token{expression}]} - \production{funcname} - {\token{identifier}} -\end{productionlist} - -A function definition is an executable statement. Its execution binds -the function name in the current local namespace to a function object -(a wrapper around the executable code for the function). This -function object contains a reference to the current global namespace -as the global namespace to be used when the function is called. -\indexii{function}{name} -\indexii{name}{binding} - -The function definition does not execute the function body; this gets -executed only when the function is called. - -A function definition may be wrapped by one or more decorator expressions. -Decorator expressions are evaluated when the function is defined, in the scope -that contains the function definition. The result must be a callable, -which is invoked with the function object as the only argument. -The returned value is bound to the function name instead of the function -object. Multiple decorators are applied in nested fashion. -For example, the following code: - -\begin{verbatim} -@f1(arg) -@f2 -def func(): pass -\end{verbatim} - -is equivalent to: - -\begin{verbatim} -def func(): pass -func = f1(arg)(f2(func)) -\end{verbatim} - -When one or more parameters have the form \var{parameter} -\code{=} \var{expression}, the function is said to have ``default -parameter values.'' For a parameter with a -default value, the corresponding argument may be omitted from a call, -in which case the parameter's default value is substituted. If a -parameter has a default value, all following parameters up until the -``\code{*}'' must also have a default value --- this is a syntactic -restriction that is not expressed by the grammar. -\indexiii{default}{parameter}{value} - -\strong{Default parameter values are evaluated when the function -definition is executed.} This means that the expression is evaluated -once, when the function is defined, and that that same -``pre-computed'' value is used for each call. This is especially -important to understand when a default parameter is a mutable object, -such as a list or a dictionary: if the function modifies the object -(e.g. by appending an item to a list), the default value is in effect -modified. This is generally not what was intended. A way around this -is to use \code{None} as the default, and explicitly test for it in -the body of the function, e.g.: - -\begin{verbatim} -def whats_on_the_telly(penguin=None): - if penguin is None: - penguin = [] - penguin.append("property of the zoo") - return penguin -\end{verbatim} - -Function call semantics are described in more detail in -section~\ref{calls}. -A function call always assigns values to all parameters mentioned in -the parameter list, either from position arguments, from keyword -arguments, or from default values. If the form ``\code{*identifier}'' -is present, it is initialized to a tuple receiving any excess -positional parameters, defaulting to the empty tuple. If the form -``\code{**identifier}'' is present, it is initialized to a new -dictionary receiving any excess keyword arguments, defaulting to a -new empty dictionary. Parameters after ``\code{*}'' or ``\code{*identifier}'' -are keyword-only parameters and may only be passed used keyword arguments. - -Parameters may have annotations of the form ``\code{: expression}'' -following the parameter name. Any parameter may have an annotation even -those of the form \code{*identifier} or \code{**identifier}. -Functions may have ``return'' annotation of the form ``\code{-> expression}'' -after the parameter list. These annotations can be any valid Python -expression and are evaluated when the function definition is executed. -Annotations may be evaluated in a different order than they appear in the -source code. The presence of annotations does not change the semantics of a -function. The annotation values are available as values of a dictionary -keyed by the parameters' names in the \member{__annotations__} -attribute of the function object. -\indexii{function}{annotations} - -It is also possible to create anonymous functions (functions not bound -to a name), for immediate use in expressions. This uses lambda forms, -described in section~\ref{lambda}. Note that the lambda form is -merely a shorthand for a simplified function definition; a function -defined in a ``\keyword{def}'' statement can be passed around or -assigned to another name just like a function defined by a lambda -form. The ``\keyword{def}'' form is actually more powerful since it -allows the execution of multiple statements and annotations. -\indexii{lambda}{form} - -\strong{Programmer's note:} Functions are first-class objects. A -``\code{def}'' form executed inside a function definition defines a -local function that can be returned or passed around. Free variables -used in the nested function can access the local variables of the -function containing the def. See section~\ref{naming} for details. - - -\section{Class definitions\label{class}} -\indexii{class}{definition} -\stindex{class} - -A class definition defines a class object (see section~\ref{types}): -\obindex{class} - -\begin{productionlist} - \production{classdef} - {"class" \token{classname} [\token{inheritance}] ":" - \token{suite}} - \production{inheritance} - {"(" [\token{expression_list}] ")"} - \production{classname} - {\token{identifier}} -\end{productionlist} - -A class definition is an executable statement. It first evaluates the -inheritance list, if present. Each item in the inheritance list -should evaluate to a class object or class type which allows -subclassing. The class's suite is then executed -in a new execution frame (see section~\ref{naming}), using a newly -created local namespace and the original global namespace. -(Usually, the suite contains only function definitions.) When the -class's suite finishes execution, its execution frame is discarded but -its local namespace is saved. A class object is then created using -the inheritance list for the base classes and the saved local -namespace for the attribute dictionary. The class name is bound to this -class object in the original local namespace. -\index{inheritance} -\indexii{class}{name} -\indexii{name}{binding} -\indexii{execution}{frame} - -\strong{Programmer's note:} Variables defined in the class definition -are class variables; they are shared by all instances. To define -instance variables, they must be given a value in the -\method{__init__()} method or in another method. Both class and -instance variables are accessible through the notation -``\code{self.name}'', and an instance variable hides a class variable -with the same name when accessed in this way. Class variables with -immutable values can be used as defaults for instance variables. -For new-style classes, descriptors can be used to create instance -variables with different implementation details. |