简介
将下一个新版本的特性导入到当前版本并进行测试(新版的改动不兼容老版本,就是这么任性)。
py2.7-源代码: Lib/__future__.py
py3.7-源代码:Lib/__future__.py
属性
python2.7
1 | >>> import __future__ as ft |
python3.7
1 | >>> import __future__ as ft |
__future__.py
中的每一条语句都是以下格式的:
1 | FeatureName = _Feature(OptionalRelease, MandatoryRelease, CompilerFlag) |
OptionalRelease 和 MandatoryRelease 的格式为 5 元素元组,如下:
1 | (PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int |
OptionalRelease
- 记录一个特性首次发布时的 Python 版本。
MandatoryRelases
未发布时,表示该特性会变成语言的一部分的预测时间。
发布后,用来记录这个特性是何时成为语言的一部分的。从该版本往后,使用该特性将不需要 future 语句,不过很多人还是会加上对应的 import。
若是 None, 表示这个特性已经被撤销。
CompilerFlag
- 若代码需要动态编译,在调用内建函数compile() 时需传入以开启对应的特性,其存储在对应实例的compiler_flag变量中。
__future__ 中不会删除特性的描述。从 Python 2.1 中首次加入以来,通过这种方式引入了以下特性:
特性 | 可选版本 | 强制加入版本 | 效果 |
---|---|---|---|
nested_scopes | 2.1.0b1 | 2.2 | PEP 227: Statically Nested Scopes |
generators | 2.2.0a1 | 2.3 | PEP 255: Simple Generators |
division | 2.2.0a2 | 3.0 | PEP 238: Changing the Division Operator |
absolute_import | 2.5.0a1 | 3.0 | PEP 328: Imports: Multi-Line and Absolute/Relative |
with_statement | 2.5.0a1 | 2.6 | PEP 343: The “with” Statement |
print_function | 2.6.0a2 | 3.0 | PEP 3105: Make print a function |
unicode_literals | 2.6.0a2 | 3.0 | PEP 3112: Bytes literals in Python 3000 |
generator_stop | 3.5.0b1 | 3.7 | PEP 479: StopIteration handling inside generators |
annotations | 3.7.0b1 | 4.0 | PEP 563: Postponed evaluation of annotations |
用法
division
python 2.7示例:
1 | # Python 2.x中,对于除法有两种情况,如果是整数相除,结果仍是整数,余数会被扔掉,这种除法叫“地板除” |
1 | # Python 3.x中,所有的除法都是精确除法,地板除用//表示 |
unicode_literals
python2.7示例:
1 | >>> type('hello world') |
python3.7示例:
1 | >>> type('hello world') |
注:如果你是python2.X版本,在导入新的功能特性后,就应该按照新功能的特性进行编写。
absolute_import
加入绝对引入新特性