4. 실행 모델
************


4.1. 이름과 연결(binding)
=========================

*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.

코드 블록은 *실행 프레임 (execution frame)* 에서 실행된다. 프레임은 몇
몇 관리를 위한 정보(디버깅에 사용된다)를 포함하고, 코드 블록의 실행이
끝난 후에 어디서 어떻게 실행을 계속할 것인지를 결정한다.

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))

이름이 코드 블록 내에서 사용될 때, 가장 가깝게 둘러싸고 있는 스코프에
있는 것으로 검색된다. 코드 블록이 볼 수 있는 모든 스코프의 집합을 블록
의 *환경 (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.  (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".

각 대입이나 임포트 문은 클래스나 함수 정의 때문에 정의되는 블록 내에
등장할 수 있고, 모듈 수준(최상위 코드 블록)에서 등장할 수도 있다.

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.

모듈의 이름 공간은 모듈이 처음 임포트될 때 자동으로 만들어진다. 스크립
트의 메인 모듈은 항상 "__main__" 이라고 불린다.

"global" 문은 같은 블록의 이름 연결 연산과 같은 스코프를 갖는다. 자유
변수의 경우 가장 가까이서 둘러싸는 스코프가 global 문을 포함한다면, 그
자유 변수는 전역으로 취급된다.

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. 동적 기능과의 상호작용
-----------------------------

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. 예외
=========

예외는 에러나 예외적인 조건을 처리하기 위해 코드 블록의 일반적인 제어
흐름을 깨는 수단이다. 에러가 감지된 지점에서 예외를 *일으킨다
(raised)*; 둘러싼 코드 블록이나 직접적 혹은 간접적으로 에러가 발생한
코드 블록을 호출한 어떤 코드 블록에서건 예외는 처리될 수 있다.

파이썬 인터프리터는 실행 시간 에러(0으로 나누는 것 같은)를 감지할 때
예외를 일으킨다. 파이썬 프로그램은 "raise" 문을 사용해서 명시적으로 예
외를 일으킬 수 있다. 예외 처리기는 "try" ... "except" 문으로 지정된다.
그런 문장에서 "finally" 구는 정리(cleanup) 코드를 지정하는 데 사용되는
데, 예외를 처리하는 것이 아니라 앞선 코드에서 예외가 발생하건 그렇지
않건 실행된다.

파이썬은 에러 처리에 "종결 (termination)" 모델을 사용한다; 예외 처리기
가 뭐가 발생했는지 발견할 수 있고, 바깥 단계에서 실행을 계속할 수는 있
지만, 에러의 원인을 제거한 후에 실패한 연산을 재시도할 수는 없다(문제
의 코드 조각을 처음부터 다시 시작시키는 것은 예외다).

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".

예외는 클래스 인스턴스로 구분된다. "except" 절은 인스턴스의 클래스에
따라 선택된다: 인스턴스의 클래스나 그것의 베이스 클래스를 가리켜야 한
다. 인스턴스는 핸들러가 수신할 수 있고 예외적인 조건에 대한 추가적인
정보를 포함할 수 있다.

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.

주석: 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.

섹션 try 문 에서 "try" 문, raise 문 에서 "raise" 문에 대한 설명이 제공
된다.

-[ 각주 ]-

[1] 이 한계는 이 연산들 때문에 실행되는 코드가 모듈이 컴파일되는
    시점 에는 존재하지 않았기 때문이다.
