4. Modèle d’exécution
*********************


4.1. Noms et liaisons
=====================

*Names* refer to objects.  Names are introduced by name binding
operations. Each occurrence of a name in the program text refers to
the *binding* of that name established in the innermost function block
containing the use.

A *block* is a piece of Python program text that is executed as a
unit. The following are blocks: a module, a function body, and a class
definition. Each command typed interactively is a block.  A script
file (a file given as standard input to the interpreter or specified
on the interpreter command line the first argument) is a code block.
A script command (a command specified on the interpreter command line
with the “**-c**” option) is a code block.  The file read by the
built-in function "execfile()" is a code block.  The string argument
passed to the built-in function "eval()" and to the "exec" statement
is a code block. The expression read and evaluated by the built-in
function "input()" is a code block.

Un bloc de code est exécuté dans un *cadre d’exécution*. Un cadre
contient des informations administratives (utilisées pour le débogage)
et détermine où et comment l’exécution se poursuit après la fin de
l’exécution du bloc de code.

A *scope* defines the visibility of a name within a block.  If a local
variable is defined in a block, its scope includes that block.  If the
definition occurs in a function block, the scope extends to any blocks
contained within the defining one, unless a contained block introduces
a different binding for the name.  The scope of names defined in a
class block is limited to the class block; it does not extend to the
code blocks of methods – this includes generator expressions since
they are implemented using a function scope.  This means that the
following will fail:

   class A:
       a = 42
       b = list(a + i for i in range(10))

Quand un nom est utilisé dans un bloc de code, la résolution utilise
la portée la plus petite. L’ensemble de toutes les portées visibles
dans un bloc de code s’appelle *l’environnement* du bloc.

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.  (The
variables of the module code block are local and global.)  If a
variable is used in a code block but not defined there, it is a *free
variable*.

When a name is not found at all, a "NameError" exception is raised.
If the name refers to a local variable that has not been bound, a
"UnboundLocalError" exception is raised.  "UnboundLocalError" is a
subclass of "NameError".

The following constructs bind names: formal parameters to functions,
"import" statements, class and function definitions (these bind the
class or function name in the defining block), and targets that are
identifiers if occurring in an assignment, "for" loop header, in the
second position of an "except" clause header or after "as" in a "with"
statement.  The "import" statement of the form "from ... import *"
binds all names defined in the imported module, except those beginning
with an underscore.  This form may only be used at the module level.

A target occurring in a "del" statement is also considered bound for
this purpose (though the actual semantics are to unbind the name).  It
is illegal to unbind a name that is referenced by an enclosing scope;
the compiler will report a "SyntaxError".

Chaque assignation ou instruction *import* a lieu dans un bloc défini
par une définition de classe ou de fonction ou au niveau du module (le
bloc de code de plus haut niveau).

If a name binding operation occurs anywhere within a code block, all
uses of the name within the block are treated as references to the
current block.  This can lead to errors when a name is used within a
block before it is bound. This rule is subtle.  Python lacks
declarations and allows name binding operations to occur anywhere
within a code block.  The local variables of a code block can be
determined by scanning the entire text of the block for name binding
operations.

If the global statement occurs within a block, all uses of the name
specified in the statement refer to the binding of that name in the
top-level namespace. Names are resolved in the top-level namespace by
searching the global namespace, i.e. the namespace of the module
containing the code block, and the builtins namespace, the namespace
of the module "__builtin__".  The global namespace is searched first.
If the name is not found there, the builtins namespace is searched.
The global statement must precede all uses of the name.

The builtins namespace associated with the execution of a code block
is actually found by looking up the name "__builtins__" in its global
namespace; this should be a dictionary or a module (in the latter case
the module’s dictionary is used).  By default, when in the "__main__"
module, "__builtins__" is the built-in module "__builtin__" (note: no
“s”); when in any other module, "__builtins__" is an alias for the
dictionary of the "__builtin__" module itself.  "__builtins__" can be
set to a user-created dictionary to create a weak form of restricted
execution.

**CPython implementation detail:** Users should not touch
"__builtins__"; it is strictly an implementation detail.  Users
wanting to override values in the builtins namespace should "import"
the "__builtin__" (no “s”) module and modify its attributes
appropriately.

L’espace de noms pour un module est créé automatiquement la première
fois que le module est importé. Le module principal d’un script
s’appelle toujours "__main__".

L’instruction "global" a la même porte qu’une opération de liaison du
même bloc. Si la portée englobante la plus petite pour une variable
libre contient une instruction *global*, la variable libre est
considérée globale.

A class definition is an executable statement that may use and define
names. These references follow the normal rules for name resolution.
The namespace of the class definition becomes the attribute dictionary
of the class.  Names defined at the class scope are not visible in
methods.


4.1.1. Interaction avec les fonctionnalités dynamiques
------------------------------------------------------

There are several cases where Python statements are illegal when used
in conjunction with nested scopes that contain free variables.

If a variable is referenced in an enclosing scope, it is illegal to
delete the name.  An error will be reported at compile time.

If the wild card form of import — "import *" — is used in a function
and the function contains or is a nested block with free variables,
the compiler will raise a "SyntaxError".

If "exec" is used in a function and the function contains or is a
nested block with free variables, the compiler will raise a
"SyntaxError" unless the exec explicitly specifies the local namespace
for the "exec".  (In other words, "exec obj" would be illegal, but
"exec obj in ns" would be legal.)

The "eval()", "execfile()", and "input()" functions and the "exec"
statement do not have access to the full environment for resolving
names.  Names may be resolved in the local and global namespaces of
the caller.  Free variables are not resolved in the nearest enclosing
namespace, but in the global namespace. [1] The "exec" statement and
the "eval()" and "execfile()" functions have optional arguments to
override the global and local namespace.  If only one namespace is
specified, it is used for both.


4.2. Exceptions
===============

Les exceptions sont un moyen de sortir du flot normal d’exécution d’un
bloc de code de manière à gérer des erreurs ou des conditions
exceptionnelles. Une exception est *levée* au moment où l’erreur est
détectée ; elle doit être *gérée* par le bloc de code qui l’entoure ou
par tout bloc de code qui a, directement ou indirectement, invoqué le
bloc de code où l’erreur s’est produite.

L’interpréteur Python lève une exception quand il détecte une erreur à
l’exécution (telle qu’une division par zéro). Un programme Python peut
aussi lever explicitement une exception avec l’instruction "raise".
Les gestionnaires d’exception sont spécifiés avec l’instruction "try"
… "except". La clause  "finally" d’une telle instruction peut être
utilisée pour spécifier un code de nettoyage qui ne gère pas
l’exception mais qui est exécuté quoi qu’il arrive (exception ou pas).

Python utilise le modèle par *terminaison* de gestion des erreurs : un
gestionnaire d’exception peut trouver ce qui est arrivé et continuer
l’exécution à un niveau plus élevé mais il ne peut pas réparer
l’origine de l’erreur et ré-essayer l’opération qui a échoué (sauf à
entrer à nouveau dans le code en question par le haut).

When an exception is not handled at all, the interpreter terminates
execution of the program, or returns to its interactive main loop.  In
either case, it prints a stack backtrace, except when the exception is
"SystemExit".

Les exceptions sont identifiées par des instances de classe. La clause
"except" sélectionnée dépend de la classe de l’instance : elle doit
faire référence à la classe de l’instance ou à une de ses classes
ancêtres. L’instance peut être transmise au gestionnaire et peut
apporter des informations complémentaires sur les conditions de
l’exception.

Exceptions can also be identified by strings, in which case the
"except" clause is selected by object identity.  An arbitrary value
can be raised along with the identifying string which can be passed to
the handler.

Note: Messages to exceptions are not part of the Python API.  Their
  contents may change from one version of Python to the next without
  warning and should not be relied on by code which will run under
  multiple versions of the interpreter.

Reportez-vous aussi aux descriptions de l’instruction "try" dans la
section L’instruction try et de l’instruction "raise" dans la section
L’instruction raise.

-[ Notes ]-

[1] En effet, le code qui est exécuté par ces opérations n’est pas
    connu au moment où le module est compilé.
