__future__ — 未來語句定義

原始碼: Lib/__future__.py


形如 from __future__ import feature 的匯入語句被稱為未來語句。Python 編譯器會特殊處理這些語句,以便在功能成為標準之前,在包含未來語句的模組中使用新的 Python 功能。

雖然這些未來語句由 Python 編譯器賦予了特殊的含義,但它們仍然像任何其他匯入語句一樣執行,並且 __future__ 存在並且由匯入系統以與其他任何 Python 模組相同的方式處理。 此設計有三個目的:

  • 避免混淆分析匯入語句並期望找到它們正在匯入的模組的現有工具。

  • 記錄何時引入不相容的更改,以及何時(或曾經)強制執行這些更改。 這是一種可執行文件的形式,可以透過匯入 __future__ 並檢查其內容來以程式設計方式進行檢查。

  • 確保 未來語句 在 Python 2.1 之前的版本下至少會產生執行時異常(因為在 2.1 之前沒有同名模組,所以匯入 __future__ 將會失敗)。

模組內容

永遠不會從 __future__ 中刪除任何功能描述。 自從 Python 2.1 引入以來,以下功能透過此機制進入了該語言:

功能

可選版本

強制版本

效果

nested_scopes

2.1.0b1

2.2

PEP 227靜態巢狀作用域

generators

2.2.0a1

2.3

PEP 255簡單生成器

division

2.2.0a2

3.0

PEP 238更改除法運算子

absolute_import

2.5.0a1

3.0

PEP 328匯入:多行和絕對/相對

with_statement

2.5.0a1

2.6

PEP 343“with” 語句

print_function

2.6.0a2

3.0

PEP 3105使 print 成為一個函式

unicode_literals

2.6.0a2

3.0

PEP 3112Python 3000 中的位元組字面量

generator_stop

3.5.0b1

3.7

PEP 479生成器內部的 StopIteration 處理

annotations

3.7.0b1

待定 [1]

PEP 563延遲評估註解

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 會預測該功能將成為語言一部分的版本。

否則,MandatoryRelease 記錄該功能成為語言一部分的時間;在該版本或之後的版本中,模組不再需要未來語句來使用相關功能,但可以繼續使用此類匯入。

MandatoryRelease 也可能是 None,這意味著計劃的功能被放棄了,或者尚未決定。

_Feature.compiler_flag

CompilerFlag 是應在內建函式 compile() 的第四個引數中傳遞的(位域)標誌,以便在動態編譯的程式碼中啟用該功能。 該標誌儲存在 _Feature.compiler_flag 屬性中,該屬性位於 _Feature 例項上。

另請參閱

未來語句

編譯器如何處理未來匯入。

PEP 236 - 回到 __future__

__future__ 機制的最初提案。