29.10. "__future__" --- future 文の定義
***************************************

**ソースコード:** Lib/__future__.py

======================================================================

"__future__" は実際にモジュールであり、次の3つの役割があります:

* import 文を解析する既存のツールを混乱させることを避け、インポート
  し ようとしているモジュールを見つけられるようにするため。

* 2.1 以前のリリースで future 文 が実行された場合に、最低でもランタ
  イ ム例外を投げるようにするため ("__future__" のインポートは失敗しま
  す 。なぜなら、 2.1 以前にはそういう名前のモジュールはなかったからで
  す) 。

* 互換性のない変化がいつ言語に導入され、いつ言語の一部になる --- あ
  る いは、なった --- のかを文書化するため。これは実行できる形式で書か
  れ たドキュメントなので、 "__future__" をインポートしてその中身を調
  べる ことでプログラムから調査することができます。

"__future__.py" のそれぞれの文は次のような形式をしています:

   FeatureName = _Feature(OptionalRelease, MandatoryRelease,
                          CompilerFlag)

ここで、普通は、 *OptionalRelease* は *MandatoryRelease* より小さく、2
つとも "sys.version_info" と同じフォーマットの5つのタプルからなります:

   (PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int
    PY_MINOR_VERSION, # the 1; an int
    PY_MICRO_VERSION, # the 0; an int
    PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string
    PY_RELEASE_SERIAL # the 3; an int
   )

*OptionalRelease* はその機能が導入された最初のリリースを記録します。

まだ時期が来ていない *MandatoryRelease* の場合、*MandatoryRelease* は
その機能が言語の一部となるリリースを記します。

その他の場合、*MandatoryRelease* はその機能がいつ言語の一部になったの
かを記録します。そのリリースから、あるいはそれ以降のリリースでは、この
機能を使う際に future 文は必要ではありませんが、future 文を使い続けて
も構いません。

*MandatoryRelease* は "None" になるかもしれません。つまり、予定された
機能が破棄されたということです。

"_Feature" クラスのインスタンスには対応する2つのメソッド、
"getOptionalRelease()" と "getMandatoryRelease()" があります。

*CompilerFlag* は、動的にコンパイルされるコードでその機能を有効にする
ために、組み込み関数 "compile()" の第4引数に渡す(ビットフィールド)フラ
グです。このフラグは "_Feature" インスタンスの "compiler_flag" 属性に
保存されています。

機能の記述が "__future__" から削除されたことはまだありません。 Python
2.1 で future 文が導入されて以来、この仕組みを使って以下の機能が言語に
導入されてきました:

+--------------------+---------------+----------------+-----------------------------------------------+
| feature            | optional in   | mandatory in   | effect                                        |
|====================|===============|================|===============================================|
| nested_scopes      | 2.1.0b1       | 2.2            | **PEP 227**: *Statically Nested Scopes*       |
+--------------------+---------------+----------------+-----------------------------------------------+
| generators         | 2.2.0a1       | 2.3            | **PEP 255**: *Simple Generators*              |
+--------------------+---------------+----------------+-----------------------------------------------+
| division           | 2.2.0a2       | 3.0            | **PEP 238**: *Changing the Division Operator* |
+--------------------+---------------+----------------+-----------------------------------------------+
| absolute_import    | 2.5.0a1       | 3.0            | **PEP 328**: *Imports: Multi-Line and         |
|                    |               |                | Absolute/Relative*                            |
+--------------------+---------------+----------------+-----------------------------------------------+
| with_statement     | 2.5.0a1       | 2.6            | **PEP 343**: *The "with" Statement*           |
+--------------------+---------------+----------------+-----------------------------------------------+
| print_function     | 2.6.0a2       | 3.0            | **PEP 3105**: *Make print a function*         |
+--------------------+---------------+----------------+-----------------------------------------------+
| unicode_literals   | 2.6.0a2       | 3.0            | **PEP 3112**: *Bytes literals in Python 3000* |
+--------------------+---------------+----------------+-----------------------------------------------+
| generator_stop     | 3.5.0b1       | 3.7            | **PEP 479**: *StopIteration handling inside   |
|                    |               |                | generators*                                   |
+--------------------+---------------+----------------+-----------------------------------------------+

参考:

  future 文 (future statement)
     コンパイラがどのように future インポートを扱うか。
