__future__ --- Future 陳述式定義

原始碼:Lib/__future__.py


from__future__importfeature 形式的引入被稱為future 陳述式。這些是 Python 編譯器的特殊情況,允許在該功能成為標準版本之前在包含 future 陳述式的模組中使用新的 Python 功能。

雖然這些 future 陳述式被 Python 編譯器賦予了額外的特殊意義,但它們仍然像任何其他 import 陳述式一樣執行,且__future__ 由引入系統以和任何其他 Python 模組相同的方式處理。這個設計有三個目的:

  • 為了避免混淆分析引入陳述式並預期要找到它們正在引入之模組的現有工具。

  • 記錄何時出現不相容的變更,以及何時開始強制執行這些變更。這是一種可執行文件的形式,可以透過引入__future__ 並檢查其內容以程式化的方式進行檢查。

  • 確保future 陳述式在 Python 2.1 之前的版本中運行至少會產生 runtime 例外(__future__ 的引入將會失敗,因為 2.1 之前沒有該名稱的模組)。

模組內容

不會從__future__ 中刪除任何功能描述。自從在 Python 2.1 中引入以來,以下功能已透過這種機制引入到該語言中:

功能

可選的版本

強制性的版本

影響

__future__.nested_scopes

2.1.0b1

2.2

PEP 227:靜態巢狀作用域 (Statically Nested Scopes)

__future__.generators

2.2.0a1

2.3

PEP 255:簡單產生器 (Simple Generators)

__future__.division

2.2.0a2

3.0

PEP 238:更改除法運算子 (Changing the Division Operator)

__future__.absolute_import

2.5.0a1

3.0

PEP 328:引入:多列與絕對/相對 (Imports: Multi-Line and Absolute/Relative)

__future__.with_statement

2.5.0a1

2.6

PEP 343:"with" 陳述式 (The "with" Statement)

__future__.print_function

2.6.0a2

3.0

PEP 3105:使 print 成為一個函式 (Make print a function)

__future__.unicode_literals

2.6.0a2

3.0

PEP 3112:Python 3000 中的位元組字面值 (Bytes literals in Python 3000)

__future__.generator_stop

3.5.0b1

3.7

PEP 479:產生器內部的 StopIteration 處理 (StopIteration handling inside generators)

__future__.annotations

3.7.0b1

從未[1]

PEP 563:註釋的延後求值 (Postponed evaluation of annotations)PEP 649:使用描述器延遲求值註釋 (Deferred evaluation of annotations using descriptors)

class__future__._Feature

__future__.py 中的每個陳述式的形式如下:

FeatureName=_Feature(OptionalRelease,MandatoryRelease,CompilerFlag)

通常,OptionalRelease 會小於MandatoryRelease,且兩者都是與sys.version_info 形式相同的 5 元組 (5-tuple):

(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 記錄該功能首次發布時的 Python 版本。

_Feature.getMandatoryRelease()

如果MandatoryRelease 尚未發布,MandatoryRelease 會預測該功能將成為該語言一部分的版本。

否則MandatoryRelease 會記錄該功能是何時成為語言的一部分;在該版本或之後的版本中,模組不再需要 future 聲明來使用相關功能,但可以繼續使用此種引入方式。

MandatoryRelease 也可能是None,這意味著計劃中的功能被丟棄或者仍未決定。

_Feature.compiler_flag

CompilerFlag 是(位元欄位 (bitfield))旗標,應在第四個引數中傳遞給內建函式compile() 以在動態編譯的程式碼中啟用該功能。此旗標儲存在_Feature 實例上的_Feature.compiler_flag 屬性中。

[1]

from__future__importannotations 原本預定在 Python 3.10 中成為強制性功能,但該變更被延後並最終取消。此功能最終將被棄用並移除。請參閱PEP 649PEP 749

也參考

Future statements

編譯器如何處理 future 引入。

PEP 236 - 回到 __future__

__future__ 機制的原始提案。