__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__ 机制的最初提议。