__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 3112:Python 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
实例上。