__future__——未来语句定义

源代码: Lib/__future__.py


形式为 from __future__ import feature 的导入称为 未来语句。Python 编译器对这些语句进行了特殊处理,以便在包含未来语句的模块中使用 Python 的新功能,而无需等到该功能成为标准的版本。

虽然 Python 编译器赋予这些未来语句额外的特殊含义,但它们仍然像任何其他导入语句一样执行,并且 __future__ 存在并由导入系统处理,就像任何其他 Python 模块一样。此设计有三个目的

  • 避免混淆分析导入语句并希望找到其正在导入的模块的现有工具。

  • 记录何时引入不兼容的更改,以及何时——或是否——使其成为强制性。这是一种可执行文档形式,可以通过导入 __future__ 并检查其内容以进行编程检查。

  • 确保 未来语句 在 Python 2.1 之前的版本下运行,至少会产生运行时异常(__future__ 的导入将失败,因为在 2.1 之前没有该名称的模块)。

模块内容

永远不会从 __future__ 中删除任何功能描述。自 Python 2.1 中引入以来,以下功能已通过此机制进入语言

功能

可选

强制

效果

nested_scopes

2.1.0b1

2.2

PEP 227: 静态嵌套作用域

生成器

2.2.0a1

2.3

PEP 255: 简单生成器

除法

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 3112: Python 3000 中的字节文字

generator_stop

3.5.0b1

3.7

PEP 479: 生成器内部的 StopIteration 处理

注释

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()

对于尚未发生的 MandatoryReleaseMandatoryRelease 预测该功能将成为语言一部分的版本。

否则,MandatoryRelease 记录该功能成为语言一部分的时间;在该版本或之后,模块不再需要 future 语句来使用该功能,但可以继续使用此类导入。

MandatoryRelease 也可能是 None,这意味着已计划的功能已被删除或尚未决定。

_Feature.compiler_flag

CompilerFlag 是内置函数 compile() 的第四个参数中应传递的(位域)标志,以在动态编译代码中启用该功能。此标志存储在 _Feature.compiler_flag 属性中,位于 _Feature 实例上。

另请参阅

未来语句

编译器如何处理未来导入。

PEP 236 - 返回 __future__

__future__ 机制的原始提案。