__future__
— Future 語句定義¶
形如 from __future__ import feature
的匯入被稱為 future 語句。Python 編譯器會對這些語句進行特殊處理,以便在包含 future 語句的模組中,能提前使用在未來版本中才成為標準的新 Python 功能。
雖然這些 future 語句被 Python 編譯器賦予了額外的特殊含義,但它們仍然像任何其他 import 語句一樣被執行,並且 __future__
模組也存在,並由匯入系統以與其他任何 Python 模組相同的方式處理。此設計有三個目的:
避免讓那些分析 import 語句並期望找到其所匯入模組的現有工具感到困惑。
為了記錄不相容的改動是在何時被引入,以及它們將於何時或已在何時成為強制性要求。這是一種可執行的文件形式,並且可以透過程式設計方式匯入
__future__
並檢查其內容來進行探查。確保 future 語句 在 Python 2.1 之前的版本中執行時至少會引發執行時異常(匯入
__future__
將會失敗,因為在 2.1 之前沒有這個名字的模組)。
模組內容¶
任何功能描述都不會從 __future__
中刪除。自 Python 2.1 引入以來,以下功能已透過此機制進入該語言:
功能 |
可選起始版本 |
強制起始版本 |
作用 |
---|---|---|---|
|
2.1.0b1 |
2.2 |
PEP 227: 靜態巢狀作用域 |
|
2.2.0a1 |
2.3 |
PEP 255: 簡單生成器 |
|
2.2.0a2 |
3.0 |
PEP 238: 修改除法運算子 |
|
2.5.0a1 |
3.0 |
PEP 328: 匯入:多行與絕對/相對路徑 |
|
2.5.0a1 |
2.6 |
PEP 343: "with" 語句 |
|
2.6.0a2 |
3.0 |
PEP 3105: 讓 print 成為函式 |
|
2.6.0a2 |
3.0 |
PEP 3112: Python 3000 中的位元組串字面值 |
|
3.5.0b1 |
3.7 |
PEP 479: 在生成器中處理 StopIteration |
|
3.7.0b1 |
永不 [1] |
- class __future__._Feature¶
__future__.py
中的每個語句都採用以下形式:FeatureName = _Feature(OptionalRelease, MandatoryRelease, CompilerFlag)
其中,通常情況下,OptionalRelease 小於 MandatoryRelease,並且兩者都是與
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 )
- _Feature.getOptionalRelease()¶
OptionalRelease 記錄了該功能被接受的第一個版本。
- _Feature.getMandatoryRelease()¶
如果 MandatoryRelease 尚未釋出,它會預測該功能將成為該語言一部分的版本。
否則,MandatoryRelease 會記錄該功能何時成為語言的一部分;在該版本或之後的版本中,模組不再需要 future 語句來使用該功能,但可以繼續使用此類匯入。
MandatoryRelease 也可能為
None
,表示一個計劃中的功能被放棄,或者尚未決定。
- _Feature.compiler_flag¶
CompilerFlag 是一個(位域)標誌,應作為第四個引數傳遞給內建函式
compile()
,以在動態編譯的程式碼中啟用該功能。此標誌儲存在_Feature
例項的_Feature.compiler_flag
屬性中。