6. 単純文 (simple statement)
****************************

単純文とは、単一の論理行内に収められる文です。単一の行内には、複数の単
純文をセミコロンで区切って入れることができます。単純文の構文は以下の通
りです:

   simple_stmt ::= expression_stmt
                   | assert_stmt
                   | assignment_stmt
                   | augmented_assignment_stmt
                   | pass_stmt
                   | del_stmt
                   | print_stmt
                   | return_stmt
                   | yield_stmt
                   | raise_stmt
                   | break_stmt
                   | continue_stmt
                   | import_stmt
                   | future_stmt
                   | global_stmt
                   | exec_stmt


6.1. 式文 (expression statement)
================================

式文は、(主に対話的な使い方では) 値を計算して出力するために使ったり、(
通常は) プロシジャ (procedure: 有意な結果を返さない関数のことです;
Python では、プロシジャは値 "None" を返します) を呼び出すために使いま
す。その他の使い方でも式文を使うことができますし、有用なこともあります
。式文の構文は以下の通りです:

   expression_stmt ::= expression_list

式文は式のリスト (単一の式のこともあります) を値評価します。

対話モードでは、値が "None" でない場合、値を組み込み関数 "repr()" で文
字列に変換して、その結果のみからなる一行を標準出力に書き出します (
print 文 節参照 ) 。 ("None" になる式文の値は書き出されないので、プロ
シジャ呼び出しを行っても出力は得られません。 )


6.2. 代入文 (assignment statement)
==================================

代入文は、名前を値に (再) 束縛したり、変更可能なオブジェクトの属性や要
素を変更したりするために使われます:

   assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)
   target_list     ::= target ("," target)* [","]
   target          ::= identifier
              | "(" target_list ")"
              | "[" [target_list] "]"
              | attributeref
              | subscription
              | slicing

(末尾の三つのシンボルの構文については プライマリ 節を参照してください
。)

代入文は式のリスト (これは単一の式でも、カンマで区切られた式リストでも
よく、後者はタプルになることを思い出してください) を評価し、得られた単
一の結果オブジェクトをターゲット (target) のリストに対して左から右へと
代入してゆきます。

代入はターゲット (リスト) の形式に従って再帰的に行われます。ターゲット
が変更可能なオブジェクト (属性参照、添字表記、またはスライス) の一部で
ある場合、この変更可能なオブジェクトは最終的に代入を実行して、その代入
が有効な操作であるか判断しなければなりません。代入が不可能な場合には例
外を発行することもできます。型ごとにみられる規則や、送出される例外は、
そのオブジェクト型定義で与えられています (標準型の階層 節を参照してく
ださい).

ターゲットリストへのオブジェクトの代入は、以下のようにして再帰的に定義
されています。

* ターゲットリストが単一のターゲットからなる場合: オブジェクトはその
  タ ーゲットに代入されます。

* ターゲットリストが、カンマで区切られた複数のターゲットからなるリス
  ト の場合: オブジェクトはターゲットリスト中のターゲット数と同じ数の
  要素 からなるイテレート可能オブジェクトでなければならず、その各要素
  は左か ら右へと対応するターゲットに代入されます。

単一のターゲットへの単一のオブジェクトの代入は、以下のようにして再帰的
に定義されています。

* ターゲットが識別子 (名前) の場合:

  * 名前が現在のコードブロック内の "global" 文に書かれていない場合 :
    名前は現在のローカル名前空間内のオブジェクトに束縛されます。

  * それ以外の場合 : 名前は現在のグローバル名前空間内のオブジェクト
    に 束縛されます。

  名前がすでに束縛済みの場合、再束縛 (rebind) がおこなわれます。再束縛
  によって、以前その名前に束縛されていたオブジェクトの参照カウント
  (reference count) がゼロになった場合、オブジェクトは解放
  (deallocate) され、デストラクタ  (destructor) が (存在すれば) 呼び出
  されます。

* ターゲットが丸括弧や角括弧で囲われたターゲットリストの場合: オブジ
  ェ クトはターゲットリスト中のターゲット数と同じ数の要素からなるイテ
  レー ト可能オブジェクトでなければならず、その各要素は左から右へと対
  応する ターゲットに代入されます。

* ターゲットが属性参照の場合: 参照されている一次語の式が値評価されま
  す 。値は代入可能な属性を伴うオブジェクトでなければなりません; そう
  でな ければ、 "TypeError" が送出されます。次に、このオブジェクトに対
  して 、被代入オブジェクトを指定した属性に代入してよいか問い合わせま
  す; 代 入を実行できない場合、例外 (通常は "AttributeError" ですが、
  必然では ありません) を送出します。

  注意: オブジェクトがクラスインスタンスで、代入演算子の両辺に属性参照
  があるとき、右辺式の "a.x" はインスタンスの属性と (インスタンスの属
  性が存在しなければ) クラス属性のどちらにもアクセスする可能性がありま
  す。左辺のターゲット "a.x" は常にインスタンスの属性として割り当てら
  れ、必要ならば生成されます。このとおり、現れる二つの "a.x" は同じ値
  を参照するとは限りません: 右辺式はクラス属性を参照し、左辺は新しいイ
  ンスタンス属性を代入のターゲットとして生成するようなとき:

     class Cls:
         x = 3             # class variable
     inst = Cls()
     inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3

  このことは、 "property()" で作成されたプロパティのようなデスクリプタ
  属性に対しては、必ずしもあてはまるとは限りません。

* ターゲットが添字表記の場合 : 参照されている一次語の式が値評価され
  ま す。まず、値は変更可能な ( リストのような ) シーケンスオブジェク
  トか 、 ( 辞書のような ) マップオブジェクトでなければなりません。次
  に、添 字表記の表す式が値評価されます。

  一次語が変更可能な ( リストのような ) シーケンスオブジェクトの場合、
  まず添字は整数でなければなりません。添字が負数の場合、シーケンスの長
  さが加算されます。添字は最終的に、シーケンスの長さよりも小さな非負の
  整数でなくてはなりません。次に、添字をインデクスに持つ要素に非代入オ
  ブジェクトを代入してよいか、シーケンスに問い合わせます。範囲を超えた
  インデクスに対しては "IndexError" が送出されます ( 添字指定されたシ
  ーケンスに代入を行っても、リスト要素の新たな追加はできません ) 。

  一次語が (辞書のような) マップオブジェクトの場合、まず添字はマップの
  キー型と互換性のある型でなくてはなりません。次に、添字を被代入オブジ
  ェクトに関連付けるようなキー/データの対を生成するようマップオブジェ
  クトに問い合わせます。この操作では、既存のキー/値の対を同じキーと別
  の値で置き換えてもよく、(同じ値を持つキーが存在しない場合) 新たなキ
  ー/値の対を挿入してもかまいません。

* ターゲットがスライスの場合 : 参照されている一次語の式が値評価され
  ま す。まず、値は変更可能な ( リストのような ) シーケンスオブジェク
  トで なければなりません。被代入オブジェクトは同じ型を持ったシーケン
  スオブ ジェクトでなければなりません。次に、スライスの下境界と上境界
  を示す式 があれば評価されます ; デフォルト値はそれぞれゼロとシーケン
  スの長さ です。上下境界は整数にならなければなりません。いずれかの境
  界が負数に なった場合、シーケンスの長さが加算されます。最終的に、境
  界はゼロから シーケンスの長さまでの内包になるようにクリップされます
  。最後に、スラ イスを被代入オブジェクトで置き換えてよいかシーケンス
  オブジェクトに問 い合わせます。オブジェクトで許されている限り、スラ
  イスの長さは被代入 シーケンスの長さと異なっていてよく、この場合には
  ターゲットシーケンス の長さが変更されます。

現在の実装では、ターゲットの構文は式の構文と同じであるとみなされており
、無効な構文はコード生成フェーズ中に詳細なエラーメッセージを伴って拒否
されます。

警告: 代入の定義では、左辺値と右辺値がオーバラップするような代入 (例え
ば、 "a, b = b, a" を行うと、二つの変数を入れ替えます) を定義しても '
安全 (safe)' に代入できますが、代入対象となる変数群 *の間で* オーバラ
ップがある場合は安全ではありません！例えば、以下のプログラムは "[0,
2]" を出力してしまいます:

   x = [0, 1]
   i = 0
   i, x[i] = 1, 2
   print x


6.2.1. 累算代入文 (augmented assignment statement)
--------------------------------------------------

累算代入文は、二項演算と代入文を組み合わせて一つの文にしたものです:

   augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression)
   augtarget                 ::= identifier | attributeref | subscription | slicing
   augop                     ::= "+=" | "-=" | "*=" | "/=" | "//=" | "%=" | "**="
             | ">>=" | "<<=" | "&=" | "^=" | "|="

(末尾の三つのシンボルの構文については プライマリ 節を参照してください
。)

累算代入文は、ターゲット (通常の代入文と違って、アンパックは起こりませ
ん) と式リストを評価し、それら二つの被演算子間で特定の累算代入型の二項
演算を行い、結果をもとのターゲットに代入します。ターゲットは一度しか評
価されません。

"x += 1" のような累算代入式は、 "x = x + 1" のように書き換えてほぼ同様
の動作にできますが、厳密に等価にはなりません。累算代入の方では、 "x"
は一度しか評価されません。また、実際の処理として、可能ならば *インプレ
ース (in-place)* 演算が実行されます。これは、代入時に新たなオブジェク
トを生成してターゲットに代入するのではなく、以前のオブジェクトの内容を
変更するということです。

累算代入文で行われる代入は、タプルへの代入や、一文中に複数のターゲット
が存在する場合を除き、通常の代入と同じように扱われます。同様に、累算代
入で行われる二項演算は、場合によって *インプレース演算* が行われること
を除き、通常の二項演算と同じです。

属性参照のターゲットの場合、 クラスとインスタンスの属性についての注意
と同様に通常の代入が適用されます。


6.3. "assert" 文
================

assert 文は、プログラム内にデバッグ用アサーション (debugging
assertion) を仕掛けるための便利な方法です:

   assert_stmt ::= "assert" expression ["," expression]

単純な形式 "assert expression" は

   if __debug__:
       if not expression: raise AssertionError

と等価です。拡張形式 "assert expression1, expression2" は、これと等価
です

   if __debug__:
       if not expression1: raise AssertionError(expression2)

上記の等価関係は、 "__debug__" と "AssertionError" が、同名の組み込み
変数を参照しているという前提の上に成り立っています。現在の実装では、組
み込み変数 "__debug__" は通常の状況では "True" であり、最適化がリクエ
ストされた場合（コマンドラインオプション -O）は "False" です。現状のコ
ード生成器は、コンパイル時に最適化が要求されていると assert 文に対する
コードを全く出力しません。実行に失敗した式のソースコードをエラーメッセ
ージ内に入れる必要はありません; コードはスタックトレース内で表示されま
す。

"__debug__" への代入は不正な操作です。組み込み変数の値は、インタプリタ
が開始するときに決定されます。


6.4. "pass" 文
==============

   pass_stmt ::= "pass"

"pass" はヌル操作 (null operation) です --- "pass" が実行されても、何
も起きません。 "pass" は、構文法的には文が必要だが、コードとしては何も
実行したくない場合のプレースホルダとして有用です。例えば:

   def f(arg): pass    # a function that does nothing (yet)

   class C: pass       # a class with no methods (yet)


6.5. "del" 文
=============

   del_stmt ::= "del" target_list

オブジェクトの削除 (deletion) は、代入の定義と非常に似た方法で再帰的に
定義されています。ここでは完全な詳細は記述せず、いくつかのヒントを述べ
るにとどめます。

ターゲットリストに対する削除は、各々のターゲットを左から右へと順に再帰
的に削除します。

名前に対して削除を行うと、ローカルまたはグローバル名前空間でのその名前
の束縛を解除します。どちらの名前空間かは、名前が同じコードブロック内の
"global" 文で宣言されているかどうかによります。名前が未束縛 (unbound)
であるばあい、 "NameError" 例外が送出されます。

ネストしたブロック中で自由変数になっているローカル名前空間上の名前に対
する削除は不正な操作になります

属性参照、添字表記、およびスライスの削除操作は、対象となる一次語オブジ
ェクトに渡されます; スライスの削除は一般的には適切な型の空のスライスを
代入するのと等価です (が、この仕様自体もスライスされるオブジェクトで決
定されています)。


6.6. "print" 文
===============

   print_stmt ::= "print" ([expression ("," expression)* [","]]
                  | ">>" expression [("," expression)+ [","]])

"print" は、式を逐次的に評価し、得られたオブジェクトを標準出力に書き出
します。オブジェクトが文字列でなければ、まず文字列変換規則を使って文字
列に変換され、次いで ( 得られた文字列か、オリジナルの文字列が ) 書き出
されます。出力系の現在の書き出し位置が行頭にあると考えられる場合を除き
、各オブジェクトの出力前にスペースが一つ出力されます。行頭にある場合と
は、 (1) 標準出力にまだ何も書き出されていない場合、 (2) 標準出力に最後
に書き出された文字が "' '" を除く空白である、または (3) 標準出力に対す
る最後の書き出し操作が "print" 文によるものではない場合、です。 ( こう
した理由から、場合によっては空文字を標準出力に書き出すと便利なことがあ
ります。 )

注釈: 組み込みのファイルオブジェクトでない、ファイルオブジェクトに似
  た動作 をするオブジェクトでは、組み込みのファイルオブジェクトが持つ
  上記の性 質を適切にエミュレートしていないことがあるため、当てにしな
  いほうがよ いでしょう。

"print" 文がカンマで終了していない限り、末尾には文字 "'\n'" が書き出さ
れます。この仕様は、文に予約語 "print" がある場合のみの動作です。

標準出力は、組み込みモジュール "sys" 内で "stdout" という名前のファイ
ルオブジェクトとして定義されています。該当するオブジェクトが存在しない
か、オブジェクトに "write()" メソッドがない場合、 "RuntimeError" 例外
が送出されます。 .

"print" には、上で説明した構文の第二形式で定義されている拡張形式があり
ます。この形式は、 " 山形 "print" 表記 ("print" chevron)" と呼ばれます
。この形式では、 ">>" の直後にくる最初の式の値評価結果は " ファイル類
似 (file-like)" なオブジェクト、とりわけ上で述べたように "write()" メ
ソッドを持つオブジェクトでなければなりません。この拡張形式では、ファイ
ルオブジェクトを指定する式よりも後ろの式が、指定されたファイルオブジェ
クトに出力されます。最初の式の値評価結果が "None" になった場合、
"sys.stdout" が出力ファイルとして使われます。


6.7. "return" 文
================

   return_stmt ::= "return" [expression_list]

"return" は、関数定義内で構文法的にネストして現れますが、ネストしたク
ラス定義内には現れません。

式リストがある場合、リストが値評価されます。それ以外の場合は "None" で
置き換えられます。

"return" を使うと、式リスト (または "None") を戻り値として、現在の関数
呼び出しから抜け出します。

"return" によって、 "finally" 節をともなう "try" 文の外に処理が引き渡
されると、実際に関数から抜ける前に "finally" 節が実行されます。

ジェネレータ関数の場合には、 "return" 文の中に "expression_list" を入
れることはできません。ジェネレータ関数の処理コンテキストでは、単体の
"return" はジェネレータ処理を終了し "StopIteration" を送出させることを
示します。


6.8. "yield" 文
===============

   yield_stmt ::= yield_expression

"yield" 文は、ジェネレータ関数 (generator function) を定義するときだけ
使われ、かつジェネレータ関数の本体の中でだけ用いられます。関数定義中で
"yield" 文を使うだけで、関数定義は通常の関数でなくジェネレータ関数にな
ります。

ジェネレータ関数が呼び出されると、ジェネレータイテレータ (generator
iterator) 、一般的にはジェネレータ (generator) を返します。ジェネレー
タ関数の本体は、ジェネレータの "next()" が例外を発行するまで繰り返し呼
び出して実行します。

"yield" 文が実行されると、現在のジェネレータの状態は凍結 (freeze) され
、 "expression_list" の値が "next()" の呼び出し側に返されます。ここで
の "凍結" は、ローカルな変数への束縛、命令ポインタ (instruction
pointer) 、および内部実行スタック (internal evaluation stack) を含む、
全てのローカルな状態が保存されることを意味します : すなわち、必要な情
報を保存しておき、次に "next()" が呼び出された際に、関数が "yield" 文
をあたかももう一つの外部呼出しであるかのように処理できるようにします。

Python バージョン 2.5 では、 "yield" 文が "try" ... "finally" 構造にお
ける "try" 節で許されるようになりました。ジェネレータが終了（
finalized ）される（参照カウントがゼロになるか、ガベージコレクションさ
れる ) までに再開されなければ、ジェネレータ - イテレータの "close()"
メソッドが呼ばれ、留保されている "finally" 節が実行できるようになりま
す。

"yield" の意味の完全な説明は、 Yield 式 節を参照してください。

注釈: Python 2.2 では、 "generators" 機能が有効になっている場合にの
  み "yield" 文を使えました。この機能を有効にするための "__future__"
  import 文は次のとおりでした。

     from __future__ import generators

参考:

  **PEP 255** - 単純なジェネレータ
     Python へのジェネレータと "yield" 文の導入提案。

  **PEP 0342** - 拡張されたジェネレータを用いたコルーチン
     その他のジェネレータの改善と共に、 "yield" が "try" ... "finally"
     ブロックの中に存在することを可能にするための提案


6.9. "raise" 文
===============

   raise_stmt ::= "raise" [expression ["," expression ["," expression]]]

式を伴わない場合、 "raise" は現在のスコープで最終的に有効になっている
例外を再送出します。そのような例外が現在のスコープでアクティブでない場
合、 "TypeError" 例外が送出されて、これがエラーであることを示します
(IDLE で実行した場合は、代わりに exceptionQueue.Empty 例外を送出します
) 。

それ以外の場合、 "raise" は式を値評価して、三つのオブジェクトを取得し
ます。このとき、 "None" を省略された式の値として使います。最初の二つの
オブジェクトは、例外の * 型 (type)* と例外の * 値 (value)* を決定する
ために用いられます。

最初のオブジェクトがインスタンスである場合、例外の型はインスタンスのク
ラスになり、インスタンス自体が例外の値になります。このとき第二のオブジ
ェクトは "None" でなければなりません。

最初のオブジェクトがクラスの場合、例外の型になります。第二のオブジェク
トは、例外の値を決めるために使われます : 第二のオブジェクトがインスタ
ンスならば、そのインスタンスが例外の値になります。第二のオブジェクトが
タプルの場合、クラスのコンストラクタに対する引数リストとして使われます
; "None" なら、空の引数リストとして扱われ、それ以外の型ならコンストラ
クタに対する単一の引数として扱われます。このようにしてコンストラクタを
呼び出して生成したインスタンスが例外の値になります。

第三のオブジェクトが存在し、かつ "None" でなければ、オブジェクトはトレ
ースバックオブジェクトでなければなりません ( 標準型の階層 節参照 ) 。
また、例外が発生した場所は現在の処理位置に置き換えられます。第三のオブ
ジェクトが存在し、オブジェクトがトレースバックオブジェクトでも "None"
でもなければ、 "TypeError" 例外が送出されます。 "raise" の三連式型は、
"except" 節から透過的に例外を再送出するのに便利ですが、再送出すべき例
外が現在のスコープで発生した最も新しいアクティブな例外である場合には、
式なしの "raise" を使うよう推奨します。

例外に関する追加情報は 例外 節にあります。また、例外処理に関する情報は
try 文 節にあります。


6.10. "break" 文
================

   break_stmt ::= "break"

"break" 文は、構文としては "for" ループや "while" ループの内側でのみ出
現することができますが、ループ内の関数定義やクラス定義の内側には出現で
きません。

"break" 文は、文を囲う最も内側のループを終了させ、ループにオプションの
"else" 節がある場合にはそれをスキップします。

"for" ループを "break" によって終了すると、ループ制御ターゲットはその
時の値を保持します。

"break" が "finally" 節を伴う "try" 文の外側に処理を渡す際には、ループ
を実際に抜ける前にその "finally" 節が実行されます。


6.11. "continue" 文
===================

   continue_stmt ::= "continue"

"continue" 文は "for" ループや "while" ループ内のネストで構文法的にの
み現れますが、ループ内の関数定義やクラス定義、 "finally" 句の中には現
れません。 "continue" 文は、文を囲う最も内側のループの次の周期に処理を
継続します。

"continue" が "finally" 句を持った "try" 文を抜けるとき、その
"finally" 句が次のループサイクルを始める前に実行されます。


6.12. "import" 文
=================

   import_stmt     ::= "import" module ["as" name] ( "," module ["as" name] )*
                   | "from" relative_module "import" identifier ["as" name]
                   ( "," identifier ["as" name] )*
                   | "from" relative_module "import" "(" identifier ["as" name]
                   ( "," identifier ["as" name] )* [","] ")"
                   | "from" module "import" "*"
   module          ::= (identifier ".")* identifier
   relative_module ::= "."* module | "."+
   name            ::= identifier

import 文は、 (1) モジュールを探し、必要なら初期化 (initialize) する ;
("import" 文のあるスコープにおける ) ローカルな名前空間で名前を定義す
る、の二つの段階を踏んで初期化されます。 "import" 文には、 "from" を使
うか使わないかの 2 種類の形式があります。第一形式 ("from" のない形式 )
は、上記の段階をリスト中にある各識別子に対して繰り返し実行していきます
。 "from" のある形式では、 (1) を一度だけ行い、次いで (2) を繰り返し実
行します。

ステップ (1) がどのように行われるのかを理解するには、まず、 Python が
階層的なモジュール名をどう扱うのかを理解する必要があります。モジュール
を組織化し名前に階層を持たせるために、 Python はパッケージという概念を
持っています。モジュールが他のモジュールやパッケージを含むことができな
いのに対して、パッケージは他のパッケージやモジュールを含むことができま
す。ファイルシステムの視点から見ると、パッケージはディレクトリでモジュ
ールはファイルです。

モジュール名 ( 特に記述していない場合は、 " モジュール " とはパッケー
ジとモジュール両方を指しています ) が判ったとき、モジュールかパッケー
ジの検索が始まります。最初にチェックされる場所は、それまでにインポート
されたすべてのモジュールのキャッシュである "sys.modules" です。もしモ
ジュールがそこで見つかれば、それが import のステップ (2) で利用されま
す。

キャッシュにモジュールが見つからなかった場合、次は "sys.meta_path" が
検索されます。 ("sys.meta_path" の仕様は **PEP 302** に見つけることが
できます。) これは *finder* オブジェクトのリストで、そのモジュールを読
み込む方法を知っているかどうかをその "find_module()" メソッドをモジュ
ール名を引数として呼び出すことで、順番に問い合せていきます。モジュール
がパッケージに含まれていた (モジュール名の中にドットが含まれていた) 場
合、 "find_module()" の第 2 引数に親パッケージの "__path__" 属性が渡さ
れます。 (モジュール名の最後のドットより前のすべてがインポートされます
) finder はモジュールを見つけたとき、 (後で解説する) *loader* か
"None" を返します。

"sys.meta_path" に含まれるすべての finder が module を見つけられない場
合、幾つかの暗黙的に定義されている finder に問い合わせられます。どんな
暗黙の meta path finder が定義されているかは Python の実装によって様々
です。すべての実装が定義しなければならない 1 つの finder は、
"sys.path_hooks" を扱います。

この暗黙の finder は要求されたモジュールを、 2 箇所のどちらかで定義さ
れている "paths" から探します。 ("paths" がファイルシステムパスである
必要はありません ) インポートしようとしているモジュールがパッケージに
含まれている場合、親パッケージの "__path__" が "find_module()" の第 2
引数として渡され、それが paths として扱われます。モジュールがパッケー
ジに含まれていない場合、 "sys.path" が paths として扱われます。

paths が決定されたら、それを巡回してその path を扱える finder を探しま
す。 "sys.path_importer_cache" 辞書は path に対する finder をキャッシ
ュしており、 finder を探すときにチェックされます。 path がキャッシュに
登録されていない場合は、 "sys.path_hooks" の各オブジェクトを 1 つの引
数 path で呼び出します。各オブジェクトは finder を返すか、
"ImportError" を発生させます。 finder が返された場合、それを
"sys.path_importer_cache" にキャッシュして、その path に対してその
finder を使います。 finder が見つからず、 path が存在している場合、
"None" が "sys.path_importer_cache" に格納されて、暗黙の、単一のファイ
ルとしてモジュールが格納されているとしてあつかうファイルベースの
finder をその path に対して利用することを示します。その path が存在し
なかった場合、常に "None" を返す finder がその path に対するキャッシュ
として格納されます。

全ての finder がそのモジュールを見つけられないときは、 "ImportError"
が発生します。そうでなければ、どれかの finder が loader を返し、その
"load_module()" メソッドがモジュール名を引数に呼び出されてロードを行な
います。 ( ローダーのオリジナルの定義については **PEP 302** を参照して
ください。 ) loader はロードするモジュールに対して幾つかの責任がありま
す。まず、そのモジュールがすでに "sys.modules" にあれば、 ( ローダーが
import 機構の外から呼ばれた場合に有り得ます ) そのモジュールを初期化に
使い、新しいモジュールを使いません。 "sys.modules" にそのモジュールが
なければ、初期化を始める前に "sys.modules" に追加します。
"sys.modules" に追加したあと、モジュールのロード中にエラーが発生した場
合は、その辞書から削除します。モジュールが既に "sys.modules" にあった
場合は、エラーが発生してもその辞書に残しておきます。

ローダーは幾つかの属性をモジュールに設定しなければなりません。モジュー
ル名を "__name__" に設定します。ファイルの "path" を "__file__" に設定
しますが、ビルトインモジュール ("sys.builtin_module_names" にリストさ
れている ) の場合にはその属性を設定しません。インポートしているのがパ
ッケージだった場合は、そのパッケージが含むモジュールやパッケージを探す
場所の path のリストを "__path_" に設定します。 "__package__" はオプシ
ョンですが、そのモジュールやパッケージを含むパッケージ名 ( パッケージ
に含まれていないモジュールには空文字列 ) を設定するべきです。
"__loader__" もオプションですが、そのモジュールをロードした loader オ
ブジェクトを設定するべきです。

ロード中にエラーが発生した場合、他の例外がすでに伝播していないのであれ
ば、 loader は "ImportError" を発生させます。それ以外の場合は、 loader
はロードして初期化したモジュールを返します。

段階 (1) が例外を送出することなく完了したなら、段階 (2) を開始します。

"import" 文の第一形式は、ローカルな名前空間に置かれたモジュール名をモ
ジュールオブジェクトに束縛し、 import すべき次の識別子があればその処理
に移ります。モジュール名の後ろに "as" がある場合、 "as" の後ろの名前は
モジュールのローカルな名前として使われます。

"from" 形式は、モジュール名の束縛を行いません : "from" 形式では、段階
(1) で見つかったモジュール内から、識別子リストの各名前を順に検索し、見
つかったオブジェクトを識別子の名前でローカルな名前空間において束縛しま
す。 "import" の第一形式と同じように、 ""as" localname" で別名を与える
ことができます。指定された名前が見つからない場合、 "ImportError" が送
出されます。識別子のリストを星印 ("'*'") で置き換えると、モジュールで
公開されている名前 (public name) 全てを "import" 文のある場所のローカ
ルな名前空間に束縛します。

モジュールで * 公開されている名前 (public names)* は、モジュールの名前
空間内にある "__all__" という名前の変数を調べて決定します ; "__all__"
が定義されている場合、 "__all__" はモジュールで定義されていたり、
import されているような名前の文字列からなるシーケンスでなければなりま
せん。 "__all__" 内にある名前は、全て公開された名前であり、実在するも
のとみなされます。 "__all__" が定義されていない場合、モジュールの名前
空間に見つかった名前で、アンダースコア文字 ("'_'") で始まっていない全
ての名前が公開された名前になります。 "__all__" には、公開されている
API 全てを入れなければなりません。 "__all__" には、 ( モジュール内で
import されて使われているライブラリモジュールのように ) API を構成しな
い要素を意に反して公開してしまうのを避けるという意図があります。

"*" を使った "from" 形式は、モジュールのスコープ内だけに作用します。関
数内でワイルドカードの import 文 --- "import *" --- を使い、関数が自由
変数を伴うネストされたブロックであったり、ブロックを含んでいる場合、コ
ンパイラは "SyntaxError" を送出します。

インポートするモジュールを指定するとき、そのモジュールの絶対名
(absolute name) を指定する必要はありません。モジュールやパッケージが他
のパッケージに含まれている場合、共通のトップパッケージからそのパッケー
ジ名を記述することなく相対インポートすることができます。 "from" の後に
指定されるモジュールやパッケージの先頭に複数個のドットを付けることで、
正確な名前を指定することなしに現在のパッケージ階層からいくつ上の階層へ
行くかを指定することができます。先頭のドットが 1 つの場合、 import を
おこなっているモジュールが存在する現在のパッケージを示します。 3 つの
ドットは 2 つ上のレベルを示します。なので、 "pkg" パッケージの中のモジ
ュールで "from . import mod" を実行すると、 "pkg.mod" をインポートする
ことになります。 "pkg.subpkg1" の中から "from ..subpkg2 import mod" を
実行すると、 "pkg.subpkg2.mod" をインポートします。相対インポートの仕
様は **PEP 328** に含まれています。

どのモジュールがロードされるべきかを動的に決めたいアプリケーションのた
めに、組み込み関数 "importlib.import_module()" が提供されています。


6.12.1. future 文 (future statement)
------------------------------------

*future 文* は、将来の特定の Python のリリースで利用可能になるような構
文や意味付けを使って、特定のモジュールをコンパイルさせるための、コンパ
イラに対する指示句 (directive) です。 future 文は、言語仕様に非互換性
がもたらされるような、将来の Python のバージョンに容易に移行できるよう
意図されています。 future 文によって、新たな機能が標準化されたリリース
が出される前に、その機能をモジュール単位で使えるようにします。

   future_statement ::= "from" "__future__" "import" feature ["as" name]
                        ("," feature ["as" name])*
                        | "from" "__future__" "import" "(" feature ["as" name]
                        ("," feature ["as" name])* [","] ")"
   feature          ::= identifier
   name             ::= identifier

future 文は、モジュールの先頭周辺に書かなければなりません。 future 文
の前に書いてよい内容は以下です :

* モジュールのドキュメンテーション文字列 ( あれば )

* コメント ,

* 空行 ,

* その他の future 文。

Python 2.6 が認識する機能は、 "unicode_literals", "print_function",
"absolute_import", "division", "generators", "nested_scopes",
"with_statement" です。 "generators", "with_statement",
"nested_scopes" は Python 2.6 以上では常に有効なので冗長です。

future 文は、コンパイル時に特別なやり方で認識され、扱われます: 言語の
中核をなす構文構成 (construct) に対する意味付けが変更されている場合、
変更部分はしばしば異なるコードを生成することで実現されています。新たな
機能によって、(新たな予約語のような) 互換性のない新たな構文が取り入れ
られることさえあります。この場合、コンパイラはモジュールを別のやりかた
で解析する必要があるかもしれません。こうしたコード生成に関する決定は、
実行時まで先延ばしすることはできません。

これまでの全てのリリースにおいて、コンパイラはどの機能が定義済みかを知
っており、 future 文に未知の機能が含まれている場合にはコンパイル時エラ
ーを送出します。

future 文の実行時における直接的な意味付けは、 import 文と同じです。標
準モジュール "__future__" があり、これについては後で述べます。
"__future__" は、 future 文が実行される際に通常の方法で import されま
す。

future 文の実行時における特別な意味付けは、 future 文で有効化される特
定の機能によって変わります。

以下の文には、何ら特殊な意味はないので注意してください:

   import __future__ [as name]

これは future 文ではありません; この文は通常の import 文であり、その他
の特殊な意味付けや構文的な制限はありません。

future 文の入ったモジュール "M" 内で使われている "exec" 文、組み込み関
数 "compile()" や "execfile()" によってコンパイルされるコードは、デフ
ォルトの設定では、 future 文に関係する新たな構文や意味付けを使うように
なっています。 Python 2.2 からは、この仕様を "compile()" のオプション
引数で制御できるようになりました --- 詳細はこの関数に関するドキュメン
トを参照してください。

対話的インタプリタのプロンプトでタイプ入力した future 文は、その後のイ
ンタプリタセッション中で有効になります。インタプリタを "-i" オプション
で起動して実行すべきスクリプト名を渡し、スクリプト中に future 文を入れ
ておくと、新たな機能はスクリプトが実行された後に開始する対話セッション
で有効になります。

参考:

  **PEP 236** - Back to the __future__
     __future__ 機構の原案


6.13. "global" 文
=================

   global_stmt ::= "global" identifier ("," identifier)*

"global" 文は、現在のコードブロック全体で維持される宣言文です。
"global" 文は、列挙した識別子をグローバル変数として解釈するよう指定す
ることを意味します。 "global" を使わずにグローバル変数に代入を行うこと
は不可能ですが、自由変数を使えばその変数をグローバルであると宣言せずに
グローバル変数を参照することができます。

"global" 文で列挙する名前は、同じコードブロック中で、プログラムテキス
ト上 "global" 文より前に使ってはなりません。

"global" 文で列挙する名前は、 "for" ループのループ制御ターゲットや、
"class" 定義、関数定義、 "import" 文内で仮引数として使ってはなりません
。

現在の実装では、後ろ二つの制限については強制していませんが、プログラム
でこの緩和された仕様を乱用すべきではありません。将来の実装では、この制
限を強制したり、暗黙のうちにプログラムの意味付けを変更したりする可能性
があります。

**プログラマのための注意書き:** "global" はパーサーに対する指示句
(directive) です。この指示句は、 "global" 文と同時に読み込まれたコード
に対してのみ適用されます。特に、 "exec" 文内に入っている "global" 文は
、 "exec" 文を * 含んでいる * コードブロック内に効果を及ぼすことはなく
、 "exec" 文内に含まれているコードは、 "exec" 文を含むコード内での
"global" 文に影響を受けません。同様のことが、関数 "eval()" 、
"execfile()" 、および "compile()" にも当てはまります。


6.14. "exec" 文
===============

   exec_stmt ::= "exec" or_expr ["in" expression ["," expression]]

この文は、 Python コードの動的な実行をサポートします。最初の式の値評価
結果 Unicode 文字列, *Latin-1* エンコード文字列, 開かれたファイルオブ
ジェクト, コードオブジェクト, タプルのいずれかでなければなりません。文
字列の場合、一連の Python 実行文として解析し、 (構文エラーが生じない限
り) 実行します。 [1] 開かれたファイルであれば、ファイルを EOF まで読ん
で解析し、実行します。コードオブジェクトなら、単にこれを実行します。タ
プルの翻訳については後述します。全ての場合で、実行されたコードはファイ
ル入力として有効であることが期待されます (セクション ファイル入力 を参
照) 。 "return" と "yield" 文は、 "exec" 文に渡されたコードの文脈中に
おいても関数定義の外では使われない点に注意してください。

いずれの場合でも、オプションの部分が省略されると、コードは現在のスコー
プ内で実行されます。 "in" の後ろに一つだけ式を指定する場合、その式は辞
書でなくてはならず、グローバル変数とローカル変数の両方に使われます。こ
れらはそれぞれグローバル変数とローカル変数として使われます。 *locals*
を指定する場合は何らかのマップ型オブジェクトにせねばなりません。モジュ
ールレベルでは、グローバルとローカルは同じ辞書です。 *globals* と
*locals* として別のオブジェクトを取った場合、コードはクラス定義に埋め
込まれたかのように実行されます。

最初の式は長さ 2 か 3 のタプルにできます。このケースの場合は、残りの省
略可能部分は省略しなければなりません。 "exec(expr, globals)" 形式は
"exec expr in globals" と等価で、 "exec(expr, globals, locals)" 形式は
"exec expr in globals, locals" と等価です。 "exec" のタプル形式は、
"exec" が文ではなく関数になっている Python 3 との互換性を提供します。

バージョン 2.4 で変更: 以前は *locals* は辞書でなければなりませんでし
た .

"exec" の副作用として実行されるコードで設定された変数名に対応する名前
の他に、追加のキーを辞書に追加することがあります。例えば、現在の実装で
は、組み込みモジュール "__builtin__" の辞書に対する参照を、
"__builtins__" (!) というキーで追加することがあります。

**プログラマのためのヒント:** 式の動的な評価は、組み込み関数 "eval()"
でサポートされています。組み込み関数 "globals()" および "locals()" は
、それぞれ現在のグローバル辞書とローカル辞書を返すので、 "exec" に渡し
て使うと便利です。

-[ 注記 ]-

[1] なお、パーサは Unix スタイルの行末の記法しか受け付けません。コ
    ード をファイルから読んでいるなら、必ず、 *universal newlines*  モ
    ード で Windows や Mac スタイルの改行を変換してください。
