mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	The global statement allows specifying a list of identifiers
(https://docs.python.org/3/reference/simple_stmts.htmlGH-the-global-statement).
The "Execution model" chapter described the global statement as if it
only allowed one single name. Pluralize "name" in the appropriate places.
(cherry picked from commit 4ecd119b00)
Co-authored-by: Luca Chiodini <luca@chiodini.org>
Co-authored-by: Luca Chiodini <luca@chiodini.org>
		
	
			
		
			
				
	
	
		
			268 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			268 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
 | 
						|
.. _execmodel:
 | 
						|
 | 
						|
***************
 | 
						|
Execution model
 | 
						|
***************
 | 
						|
 | 
						|
.. index::
 | 
						|
   single: execution model
 | 
						|
   pair: code; block
 | 
						|
 | 
						|
.. _prog_structure:
 | 
						|
 | 
						|
Structure of a program
 | 
						|
======================
 | 
						|
 | 
						|
.. index:: block
 | 
						|
 | 
						|
A Python program is constructed from code blocks.
 | 
						|
A :dfn:`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 as a command line argument to the
 | 
						|
interpreter) is a code block.  A script command (a command specified on the
 | 
						|
interpreter command line with the :option:`-c` option) is a code block.
 | 
						|
A module run as a top level script (as module ``__main__``) from the command
 | 
						|
line using a :option:`-m` argument is also a code block. The string
 | 
						|
argument passed to the built-in functions :func:`eval` and :func:`exec` is a
 | 
						|
code block.
 | 
						|
 | 
						|
.. index:: pair: execution; frame
 | 
						|
 | 
						|
A code block is executed in an :dfn:`execution frame`.  A frame contains some
 | 
						|
administrative information (used for debugging) and determines where and how
 | 
						|
execution continues after the code block's execution has completed.
 | 
						|
 | 
						|
.. _naming:
 | 
						|
 | 
						|
Naming and binding
 | 
						|
==================
 | 
						|
 | 
						|
.. index::
 | 
						|
   single: namespace
 | 
						|
   single: scope
 | 
						|
 | 
						|
.. _bind_names:
 | 
						|
 | 
						|
Binding of names
 | 
						|
----------------
 | 
						|
 | 
						|
.. index::
 | 
						|
   single: name
 | 
						|
   pair: binding; name
 | 
						|
 | 
						|
:dfn:`Names` refer to objects.  Names are introduced by name binding operations.
 | 
						|
 | 
						|
.. index:: single: from; import statement
 | 
						|
 | 
						|
The following constructs bind names: formal parameters to functions,
 | 
						|
:keyword:`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, :keyword:`for` loop header, or after
 | 
						|
:keyword:`!as` in a :keyword:`with` statement or :keyword:`except` clause.
 | 
						|
The :keyword:`!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 :keyword:`del` statement is also considered bound for
 | 
						|
this purpose (though the actual semantics are to unbind the name).
 | 
						|
 | 
						|
Each assignment or import statement occurs within a block defined by a class or
 | 
						|
function definition or at the module level (the top-level code block).
 | 
						|
 | 
						|
.. index:: pair: free; variable
 | 
						|
 | 
						|
If a name is bound in a block, it is a local variable of that block, unless
 | 
						|
declared as :keyword:`nonlocal` or :keyword:`global`.  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 :dfn:`free variable`.
 | 
						|
 | 
						|
Each occurrence of a name in the program text refers to the :dfn:`binding` of
 | 
						|
that name established by the following name resolution rules.
 | 
						|
 | 
						|
.. _resolve_names:
 | 
						|
 | 
						|
Resolution of names
 | 
						|
-------------------
 | 
						|
 | 
						|
.. index:: scope
 | 
						|
 | 
						|
A :dfn:`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.
 | 
						|
 | 
						|
.. index:: single: environment
 | 
						|
 | 
						|
When a name is used in a code block, it is resolved using the nearest enclosing
 | 
						|
scope.  The set of all such scopes visible to a code block is called the block's
 | 
						|
:dfn:`environment`.
 | 
						|
 | 
						|
.. index::
 | 
						|
   single: NameError (built-in exception)
 | 
						|
   single: UnboundLocalError
 | 
						|
 | 
						|
When a name is not found at all, a :exc:`NameError` exception is raised.
 | 
						|
If the current scope is a function scope, and the name refers to a local
 | 
						|
variable that has not yet been bound to a value at the point where the name is
 | 
						|
used, an :exc:`UnboundLocalError` exception is raised.
 | 
						|
:exc:`UnboundLocalError` is a subclass of :exc:`NameError`.
 | 
						|
 | 
						|
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 :keyword:`global` statement occurs within a block, all uses of the names
 | 
						|
specified in the statement refer to the bindings of those names 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 :mod:`builtins`.  The
 | 
						|
global namespace is searched first.  If the names are not found there, the
 | 
						|
builtins namespace is searched.  The :keyword:`!global` statement must precede
 | 
						|
all uses of the listed names.
 | 
						|
 | 
						|
The :keyword:`global` statement has the same scope as a name binding operation
 | 
						|
in the same block.  If the nearest enclosing scope for a free variable contains
 | 
						|
a global statement, the free variable is treated as a global.
 | 
						|
 | 
						|
.. XXX say more about "nonlocal" semantics here
 | 
						|
 | 
						|
The :keyword:`nonlocal` statement causes corresponding names to refer
 | 
						|
to previously bound variables in the nearest enclosing function scope.
 | 
						|
:exc:`SyntaxError` is raised at compile time if the given name does not
 | 
						|
exist in any enclosing function scope.
 | 
						|
 | 
						|
.. index:: module: __main__
 | 
						|
 | 
						|
The namespace for a module is automatically created the first time a module is
 | 
						|
imported.  The main module for a script is always called :mod:`__main__`.
 | 
						|
 | 
						|
Class definition blocks and arguments to :func:`exec` and :func:`eval` are
 | 
						|
special in the context of name resolution.
 | 
						|
A class definition is an executable statement that may use and define names.
 | 
						|
These references follow the normal rules for name resolution with an exception
 | 
						|
that unbound local variables are looked up in the global namespace.
 | 
						|
The namespace of the class definition becomes the attribute dictionary of
 | 
						|
the class. 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
 | 
						|
comprehensions and 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))
 | 
						|
 | 
						|
.. _restrict_exec:
 | 
						|
 | 
						|
Builtins and restricted execution
 | 
						|
---------------------------------
 | 
						|
 | 
						|
.. index:: pair: restricted; execution
 | 
						|
 | 
						|
.. impl-detail::
 | 
						|
 | 
						|
   Users should not touch ``__builtins__``; it is strictly an implementation
 | 
						|
   detail.  Users wanting to override values in the builtins namespace should
 | 
						|
   :keyword:`import` the :mod:`builtins` module and modify its
 | 
						|
   attributes appropriately.
 | 
						|
 | 
						|
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
 | 
						|
:mod:`__main__` module, ``__builtins__`` is the built-in module
 | 
						|
:mod:`builtins`; when in any other module, ``__builtins__`` is an
 | 
						|
alias for the dictionary of the :mod:`builtins` module itself.
 | 
						|
 | 
						|
 | 
						|
.. _dynamic-features:
 | 
						|
 | 
						|
Interaction with dynamic features
 | 
						|
---------------------------------
 | 
						|
 | 
						|
Name resolution of free variables occurs at runtime, not at compile time.
 | 
						|
This means that the following code will print 42::
 | 
						|
 | 
						|
   i = 10
 | 
						|
   def f():
 | 
						|
       print(i)
 | 
						|
   i = 42
 | 
						|
   f()
 | 
						|
 | 
						|
.. XXX from * also invalid with relative imports (at least currently)
 | 
						|
 | 
						|
The :func:`eval` and :func:`exec` functions 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.  [#]_ The :func:`exec` and
 | 
						|
:func:`eval` functions have optional arguments to override the global and local
 | 
						|
namespace.  If only one namespace is specified, it is used for both.
 | 
						|
 | 
						|
 | 
						|
.. _exceptions:
 | 
						|
 | 
						|
Exceptions
 | 
						|
==========
 | 
						|
 | 
						|
.. index:: single: exception
 | 
						|
 | 
						|
.. index::
 | 
						|
   single: raise an exception
 | 
						|
   single: handle an exception
 | 
						|
   single: exception handler
 | 
						|
   single: errors
 | 
						|
   single: error handling
 | 
						|
 | 
						|
Exceptions are a means of breaking out of the normal flow of control of a code
 | 
						|
block in order to handle errors or other exceptional conditions.  An exception
 | 
						|
is *raised* at the point where the error is detected; it may be *handled* by the
 | 
						|
surrounding code block or by any code block that directly or indirectly invoked
 | 
						|
the code block where the error occurred.
 | 
						|
 | 
						|
The Python interpreter raises an exception when it detects a run-time error
 | 
						|
(such as division by zero).  A Python program can also explicitly raise an
 | 
						|
exception with the :keyword:`raise` statement. Exception handlers are specified
 | 
						|
with the :keyword:`try` ... :keyword:`except` statement.  The :keyword:`finally`
 | 
						|
clause of such a statement can be used to specify cleanup code which does not
 | 
						|
handle the exception, but is executed whether an exception occurred or not in
 | 
						|
the preceding code.
 | 
						|
 | 
						|
.. index:: single: termination model
 | 
						|
 | 
						|
Python uses the "termination" model of error handling: an exception handler can
 | 
						|
find out what happened and continue execution at an outer level, but it cannot
 | 
						|
repair the cause of the error and retry the failing operation (except by
 | 
						|
re-entering the offending piece of code from the top).
 | 
						|
 | 
						|
.. index:: single: SystemExit (built-in exception)
 | 
						|
 | 
						|
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 traceback, except when the exception is :exc:`SystemExit`.
 | 
						|
 | 
						|
Exceptions are identified by class instances.  The :keyword:`except` clause is
 | 
						|
selected depending on the class of the instance: it must reference the class of
 | 
						|
the instance or a base class thereof.  The instance can be received by the
 | 
						|
handler and can carry additional information about the exceptional condition.
 | 
						|
 | 
						|
.. note::
 | 
						|
 | 
						|
   Exception messages 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.
 | 
						|
 | 
						|
See also the description of the :keyword:`try` statement in section :ref:`try`
 | 
						|
and :keyword:`raise` statement in section :ref:`raise`.
 | 
						|
 | 
						|
 | 
						|
.. rubric:: Footnotes
 | 
						|
 | 
						|
.. [#] This limitation occurs because the code that is executed by these operations
 | 
						|
       is not available at the time the module is compiled.
 |