219 lines · 10.5 KB · TeX
RawDownload
\chapter{Execution model \label{execmodel}}\index{execution model}  \section{Naming and binding \label{naming}}\indexii{code}{block}\index{namespace}\index{scope} \dfn{Names}\index{name} refer to objects.  Names are introduced byname binding operations.  Each occurrence of a name in the programtext refers to the \dfn{binding}\indexii{binding}{name} of that nameestablished in the innermost function block containing the use. A \dfn{block}\index{block} is a piece of Python program text that isexecuted as a unit.  The following are blocks: a module, a functionbody, and a class definition.  Each command typed interactively is ablock.  A script file (a file given as standard input to theinterpreter or specified on the interpreter command line the firstargument) is a code block.  A script command (a command specified onthe interpreter command line with the `\strong{-c}' option) is a codeblock.  The file read by the built-in function \function{execfile()}is a code block.  The string argument passed to the built-in function\function{eval()} and to the \keyword{exec} statement is a code block.The expression read and evaluated by the built-in function\function{input()} is a code block. A code block is executed in an \dfn{executionframe}\indexii{execution}{frame}.  A frame contains someadministrative information (used for debugging) and determines whereand how execution continues after the code block's execution hascompleted. A \dfn{scope}\index{scope} defines the visibility of a name within ablock.  If a local variable is defined in a block, its scope includesthat block.  If the definition occurs in a function block, the scopeextends to any blocks contained within the defining one, unless acontained block introduces a different binding for the name.  Thescope of names defined in a class block is limited to the class block;it does not extend to the code blocks of methods. When a name is used in a code block, it is resolved using the nearestenclosing scope.  The set of all such scopes visible to a code blockis called the block's \dfn{environment}\index{environment}.   If a name is bound in a block, it is a local variable of that block.If a name is bound at the module level, it is a global variable.  (Thevariables of the module code block are local and global.)  If avariable is used in a code block but not defined there, it is a\dfn{free variable}\indexii{free}{variable}. When a name is not found at all, a\exception{NameError}\withsubitem{(built-inexception)}{\ttindex{NameError}} exception is raised.  If the namerefers to a local variable that has not been bound, a\exception{UnboundLocalError}\ttindex{UnboundLocalError} exception israised.  \exception{UnboundLocalError} is a subclass of\exception{NameError}. The following constructs bind names: formal parameters to functions,\keyword{import} statements, class and function definitions (thesebind the class or function name in the defining block), and targetsthat are identifiers if occurring in an assignment, \keyword{for} loopheader, or in the second position of an \keyword{except} clauseheader.  The \keyword{import} statement of the form ``\samp{from\ldots import *}''\stindex{from} binds all names defined in theimported module, except those beginning with an underscore.  This formmay only be used at the module level. A target occurring in a \keyword{del} statement is also considered boundfor this purpose (though the actual semantics are to unbind thename).  It is illegal to unbind a name that is referenced by anenclosing scope; the compiler will report a \exception{SyntaxError}. Each assignment or import statement occurs within a block defined by aclass or function definition or at the module level (the top-levelcode block). If a name binding operation occurs anywhere within a code block, alluses of the name within the block are treated as references to thecurrent block.  This can lead to errors when a name is used within ablock before it is bound.This rule is subtle.  Python lacks declarations and allowsname binding operations to occur anywhere within a code block.  Thelocal variables of a code block can be determined by scanning theentire text of the block for name binding operations. If the global statement occurs within a block, all uses of the namespecified in the statement refer to the binding of that name in thetop-level namespace.  Names are resolved in the top-level namespace bysearching the global namespace, i.e. the namespace of the modulecontaining the code block, and the builtin namespace, the namespace ofthe module \module{__builtin__}.  The global namespace is searchedfirst.  If the name is not found there, the builtin namespace issearched.  The global statement must precede all uses of the name. The built-in namespace associated with the execution of a code blockis actually found by looking up the name \code{__builtins__} in itsglobal namespace; this should be a dictionary or a module (in thelatter case the module's dictionary is used).  By default, when in the\module{__main__} module, \code{__builtins__} is the built-in module\module{__builtin__} (note: no `s'); when in any other module,\code{__builtins__} is an alias for the dictionary of the\module{__builtin__} module itself.  \code{__builtins__} can be setto a user-created dictionary to create a weak form of restrictedexecution\indexii{restricted}{execution}. \begin{notice}  Users should not touch \code{__builtins__}; it is strictly an  implementation detail.  Users wanting to override values in the  built-in namespace should \keyword{import} the \module{__builtin__}  (no `s') module and modify its attributes appropriately.\end{notice} The namespace for a module is automatically created the first time amodule is imported.  The main module for a script is always called\module{__main__}\refbimodindex{__main__}. The global statement has the same scope as a name binding operationin the same block.  If the nearest enclosing scope for a free variablecontains a global statement, the free variable is treated as a global. A class definition is an executable statement that may use and definenames.  These references follow the normal rules for name resolution.The namespace of the class definition becomes the attribute dictionaryof the class.  Names defined at the class scope are not visible inmethods.  \subsection{Interaction with dynamic features \label{dynamic-features}} There are several cases where Python statements are illegal whenused in conjunction with nested scopes that contain freevariables. If a variable is referenced in an enclosing scope, it is illegalto delete the name.  An error will be reported at compile time. If the wild card form of import --- \samp{import *} --- is used in afunction and the function contains or is a nested block with freevariables, the compiler will raise a \exception{SyntaxError}. If \keyword{exec} is used in a function and the function contains oris a nested block with free variables, the compiler will raise a\exception{SyntaxError} unless the exec explicitly specifies the localnamespace for the \keyword{exec}.  (In other words, \samp{exec obj}would be illegal, but \samp{exec obj in ns} would be legal.) The \function{eval()}, \function{execfile()}, and \function{input()}functions and the \keyword{exec} statement do not have access to thefull environment for resolving names.  Names may be resolved in thelocal and global namespaces of the caller.  Free variables are notresolved in the nearest enclosing namespace, but in the globalnamespace.\footnote{This limitation occurs because the code that is    executed by these operations is not available at the time the    module is compiled.}The \keyword{exec} statement and the \function{eval()} and\function{execfile()} functions have optional arguments to overridethe global and local namespace.  If only one namespace is specified,it is used for both. \section{Exceptions \label{exceptions}}\index{exception} Exceptions are a means of breaking out of the normal flow of controlof a code block in order to handle errors or other exceptionalconditions.  An exception is\emph{raised}\index{raise an exception} at the point where the erroris detected; it may be \emph{handled}\index{handle an exception} bythe surrounding code block or by any code block that directly orindirectly invoked the code block where the error occurred.\index{exception handler}\index{errors}\index{error handling} The Python interpreter raises an exception when it detects a run-timeerror (such as division by zero).  A Python program can alsoexplicitly raise an exception with the \keyword{raise} statement.Exception handlers are specified with the \keyword{try} ... \keyword{except}statement.  The \keyword{try} ... \keyword{finally} statementspecifies cleanup code which does not handle the exception, but isexecuted whether an exception occurred or not in the preceding code. Python uses the ``termination''\index{termination model} model oferror handling: an exception handler can find out what happened andcontinue execution at an outer level, but it cannot repair the causeof the error and retry the failing operation (except by re-enteringthe offending piece of code from the top). When an exception is not handled at all, the interpreter terminatesexecution of the program, or returns to its interactive main loop.  Ineither case, it prints a stack backtrace, except when the exception is \exception{SystemExit}\withsubitem{(built-inexception)}{\ttindex{SystemExit}}. Exceptions are identified by class instances.  The \keyword{except}clause is selected depending on the class of the instance: it mustreference the class of the instance or a base class thereof.  Theinstance can be received by the handler and can carry additionalinformation about the exceptional condition. Exceptions can also be identified by strings, in which case the\keyword{except} clause is selected by object identity.  An arbitraryvalue can be raised along with the identifying string which can bepassed to the handler. \deprecated{2.5}{String exceptions should not be used in new code.They will not be supported in a future version of Python.  Old codeshould be rewritten to use class exceptions instead.} \begin{notice}[warning]Messages to exceptions are not part of the Python API.  Their contents maychange from one version of Python to the next without warning and should notbe relied on by code which will run under multiple versions of theinterpreter.\end{notice} See also the description of the \keyword{try} statement insection~\ref{try} and \keyword{raise} statement insection~\ref{raise}.