7.11.1. future 语句

future 语句 是一种针对编译器的指令,指明某个特定模块应当使用在特定的未来某个 Python 发行版中成为标准特性的语法或语义。

future 语句的目的是使得向在语言中引入了不兼容改变的 Python 未来版本的迁移更为容易。 它允许基于每个模块在某种新特性成为标准之前的发行版中使用该特性。

  1. future_stmt ::= "from" "__future__" "import" feature ["as" identifier]
  2. ("," feature ["as" identifier])*
  3. | "from" "__future__" "import" "(" feature ["as" identifier]
  4. ("," feature ["as" identifier])* [","] ")"
  5. feature ::= identifier

future 语句必须在靠近模块开头的位置出现。 可以出现在 future 语句之前行只有:

  • 模块的文档字符串(如果存在),

  • 注释,

  • 空行,以及

  • 其他 future 语句。

在 Python 3.7 中唯一需要使用 future 语句的特性是 标注

future 语句所启用的所有历史特性仍然为 Python 3 所认可。 其中包括 absolute_import, division, generators, generator_stop, unicode_literals, print_function, nested_scopeswith_statement。 它们都已成为冗余项,因为它们总是为已启用状态,保留它们只是为了向后兼容。

future 语句在编译时会被识别并做特殊对待:对核心构造语义的改变常常是通过生成不同的代码来实现。 新的特性甚至可能会引入新的不兼容语法(例如新的保留字),在这种情况下编译器可能需要以不同的方式来解析模块。 这样的决定不能推迟到运行时方才作出。

对于任何给定的发布版本,编译器要知道哪些特性名称已被定义,如果某个 future 语句包含未知的特性则会引发编译时错误。

直接运行时的语义与任何 import 语句相同:存在一个后文将详细说明的标准模块 __future__,它会在执行 future 语句时以通常的方式被导入。

相应的运行时语义取决于 future 语句所启用的指定特性。

请注意以下语句没有任何特别之处:

  1. import __future__ [as name]

这并非 future 语句;它只是一条没有特殊语义或语法限制的普通 import 语句。

在默认情况下,通过对Code compiled by calls to the 内置函数 exec()compile() 的调用所编译的代码如果出现于一个包含有 future 语句的模块 M 之中,就会使用 future 语句所关联的语法和语义。 此行为可以通过 compile() 的可选参数加以控制 —- 请参阅该函数的文档以了解详情。

在交互式解释器提示符中键入的 future 语句将在解释器会话此后的交互中有效。 如果一个解释器的启动使用了 -i 选项启动,并传入了一个脚本名称来执行,且该脚本包含 future 语句,它将在交互式会话开始执行脚本之后保持有效。

参见

PEP 236 - 回到 __future__

有关 __future__ 机制的最初提议。