__future__ --- future 文の定義¶
ソースコード: Lib/__future__.py
from __future__ import feature の形式でのインポートは future 文 の定義と呼ばれています。これらは特殊なケースで、 Python の新機能が標準になるリリースの前に Python コンパイラーが future 文を含むモジュールで Python の新機能を使用できるようにします。
Python コンパイラはこれらの future 文に特別な意味を与えますが、文自体は他の import 文と同じように実行されます。
__future__ も実在するモジュールで、インポートシステムは他の Python モジュールと同じように扱います。
この設計には三つの目的があります。
import 文を解析する既存のツールを混乱させることを避け、インポートしようとしているモジュールを見つけられるようにするため。
互換性のない変更がいつ導入され、いつ必須になる予定か、またはいつ必須になったかを記録するため。 これは実行可能なドキュメントの一種で、
__future__をインポートして内容を調べることで、プログラムから確認できます。Python 2.1 より前のリリースで future 文 を実行した場合に、少なくとも実行時例外が発生するようにするため。 (2.1 より前にはその名前のモジュールがないため、
__future__のインポートは失敗します。)
モジュールコンテンツ¶
__future__ から機能の説明が削除されることはありません。
Python 2.1 での導入以来、次の機能がこの仕組みを通して言語に取り入れられました。
機能 |
選択可能になったリリース |
必須になったリリース |
内容 |
|---|---|---|---|
|
2.1.0b1 |
2.2 |
PEP 227: Statically Nested Scopes |
|
2.2.0a1 |
2.3 |
PEP 255: Simple Generators |
|
2.2.0a2 |
3.0 |
PEP 238: Changing the Division Operator |
|
2.5.0a1 |
3.0 |
PEP 328: Imports: Multi-Line and Absolute/Relative |
|
2.5.0a1 |
2.6 |
PEP 343: 「with」文 |
|
2.6.0a2 |
3.0 |
PEP 3105: Make print a function |
|
2.6.0a2 |
3.0 |
PEP 3112: Bytes literals in Python 3000 |
|
3.5.0b1 |
3.7 |
PEP 479: StopIteration handling inside generators |
|
3.7.0b1 |
予定なし [1] |
- class __future__._Feature¶
__future__.pyのそれぞれの文は次のような形式をしています:FeatureName = _Feature(OptionalRelease, MandatoryRelease, CompilerFlag)
通常、OptionalRelease は MandatoryRelease より小さく、どちらも
sys.version_infoと同じ形式の 5 要素のタプルです。(PY_MAJOR_VERSION, # 2.1.0a3 の 2。整数 PY_MINOR_VERSION, # 1。整数 PY_MICRO_VERSION, # 0。整数 PY_RELEASE_LEVEL, # "alpha", "beta", "candidate", "final" のいずれか。文字列 PY_RELEASE_SERIAL # 3。整数 )
- _Feature.getOptionalRelease()¶
OptionalRelease はその機能が導入された最初のリリースを記録します。
- _Feature.getMandatoryRelease()¶
まだ時期が来ていない MandatoryRelease の場合、MandatoryRelease はその機能が言語の一部となるリリースを記します。
その他の場合、MandatoryRelease はその機能がいつ言語の一部になったのかを記録します。そのリリースから、あるいはそれ以降のリリースでは、この機能を使う際に future 文は必要ではありませんが、future 文を使い続けても構いません。
MandatoryRelease は
Noneになるかもしれません。つまり、予定された機能が破棄されたか、まだ決定されていないということです。
- _Feature.compiler_flag¶
CompilerFlag は、動的にコンパイルされるコードでその機能を有効にするために、組み込み関数
compile()の第4引数に渡す(ビットフィールド)フラグです。このフラグは_Featureインスタンスの_Feature.compiler_flag属性に保存されています。
参考
- future 文 (future statement)
コンパイラがどのように future インポートを扱うか。
- PEP 236 - Back to the __future__
__future__ 機構の原案