28.11. __future__ --- future 文の定義

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


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

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

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

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

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

FeatureName = _Feature(OptionalRelease, MandatoryRelease,
                       CompilerFlag)

ここで、普通は、 OptionalReleaseMandatoryRelease より小さく、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 文を使い続けても構いません。

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

_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

参考

future 文 (future statement)

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