• future —- Future 语句定义

    future —- Future 语句定义

    源代码:Lib/future.py


    future 是一个真正的模块,这主要有 3 个原因:

    • 避免混淆已有的分析 import 语句并查找 import 的模块的工具。

    • 确保 future 语句 在 2.1 之前的版本运行时至少能抛出 runtime 异常(import future 会失败,因为 2.1 版本之前没有这个模块)。

    • 当引入不兼容的修改时,可以记录其引入的时间以及强制使用的时间。这是一种可执行的文档,并且可以通过 import future 来做程序性的检查。

    future.py 中的每一条语句都是以下格式的:

    1. FeatureName = _Feature(OptionalRelease, MandatoryRelease,
    2. CompilerFlag)

    通常 OptionalRelease 要比 MandatoryRelease 小,并且都是和 sys.version_info 格式一致的 5 元素元组。

    1. (PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int
    2. PY_MINOR_VERSION, # the 1; an int
    3. PY_MICRO_VERSION, # the 0; an int
    4. PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string
    5. PY_RELEASE_SERIAL # the 3; an int
    6. )

    OptionalRelease 记录了一个特性首次发布时的 Python 版本。

    MandatoryRelases 还没有发布时,MandatoryRelease 表示该特性会变成语言的一部分的预测时间。

    其他情况下,MandatoryRelease 用来记录这个特性是何时成为语言的一部分的。从该版本往后,使用该特性将不需要 future 语句,不过很多人还是会加上对应的 import。

    MandatoryRelease 也可能是 None, 表示这个特性已经被撤销。

    _Feature 类的实例有两个对应的方法,getOptionalRelease()getMandatoryRelease()

    CompilerFlag 是一个(位)标记,对于动态编译的代码,需要将这个标记作为第四个参数传入内建函数 compile() 中以开启对应的特性。这个标记存储在 _Feature 类实例的 compiler_flag 属性中。

    future 中不会删除特性的描述。从 Python 2.1 中首次加入以来,通过这种方式引入了以下特性:

    特性可选版本强制加入版本效果
    nestedscopes2.1.0b12.2PEP 227:_Statically Nested Scopes
    generators2.2.0a12.3PEP 255:Simple Generators
    division2.2.0a23.0PEP 238:Changing the Division Operator
    absoluteimport2.5.0a13.0PEP 328:_Imports: Multi-Line and Absolute/Relative
    withstatement2.5.0a12.6PEP 343:_The "with" Statement
    printfunction2.6.0a23.0PEP 3105:_Make print a function
    unicodeliterals2.6.0a23.0PEP 3112:_Bytes literals in Python 3000
    generatorstop3.5.0b13.7PEP 479:_StopIteration handling inside generators
    annotations3.7.0b14.0PEP 563:Postponed evaluation of annotations

    参见

    • future 语句
    • 编译器怎样处理 future import。