__future__ — Future 語句定義

原始碼:Lib/__future__.py


形如 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 引入以來,以下功能已透過此機制進入該語言:

功能

可選起始版本

強制起始版本

作用

__future__.nested_scopes

2.1.0b1

2.2

PEP 227: 靜態巢狀作用域

__future__.generators

2.2.0a1

2.3

PEP 255: 簡單生成器

__future__.division

2.2.0a2

3.0

PEP 238: 修改除法運算子

__future__.absolute_import

2.5.0a1

3.0

PEP 328: 匯入:多行與絕對/相對路徑

__future__.with_statement

2.5.0a1

2.6

PEP 343: "with" 語句

__future__.print_function

2.6.0a2

3.0

PEP 3105: 讓 print 成為函式

__future__.unicode_literals

2.6.0a2

3.0

PEP 3112: Python 3000 中的位元組串字面值

__future__.generator_stop

3.5.0b1

3.7

PEP 479: 在生成器中處理 StopIteration

__future__.annotations

3.7.0b1

永不 [1]

PEP 563: 推遲對註解的求值, PEP 649: 使用描述器推遲對註解的求值

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 屬性中。

參見

Future 語句

編譯器如何處理 future 匯入。

PEP 236 - 回到 __future__

__future__ 機制的最初提議。