python __future__ module

简介

将下一个新版本的特性导入到当前版本并进行测试(新版的改动不兼容老版本,就是这么任性)。

py2.7-源代码: Lib/__future__.py

py3.7-源代码:Lib/__future__.py

属性

python2.7

1
2
3
>>> import __future__ as ft
>>> dir(ft)
['CO_FUTURE_ABSOLUTE_IMPORT', 'CO_FUTURE_DIVISION', 'CO_FUTURE_PRINT_FUNCTION', 'CO_FUTURE_UNICODE_LITERALS', 'CO_FUTURE_WITH_STATEMENT', 'CO_GENERATOR_ALLOWED', 'CO_NESTED', '_Feature', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'absolute_import', 'all_feature_names', 'division', 'generators', 'nested_scopes', 'print_function', 'unicode_literals', 'with_statement']

python3.7

1
2
3
>>> import __future__ as ft
>>> dir(ft)
['CO_FUTURE_ABSOLUTE_IMPORT', 'CO_FUTURE_ANNOTATIONS', 'CO_FUTURE_BARRY_AS_BDFL', 'CO_FUTURE_DIVISION', 'CO_FUTURE_GENERATOR_STOP', 'CO_FUTURE_PRINT_FUNCTION', 'CO_FUTURE_UNICODE_LITERALS', 'CO_FUTURE_WITH_STATEMENT', 'CO_GENERATOR_ALLOWED', 'CO_NESTED', '_Feature', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'absolute_import', 'all_feature_names', 'annotations', 'barry_as_FLUFL', 'division', 'generator_stop', 'generators', 'nested_scopes', 'print_function', 'unicode_literals', 'with_statement']

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

1
FeatureName = _Feature(OptionalRelease, MandatoryRelease, CompilerFlag)

OptionalRelease 和 MandatoryRelease 的格式为 5 元素元组,如下:

1
2
3
4
5
6
(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
)

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
2
3
4
5
6
7
8
9
# Python 2.x中,对于除法有两种情况,如果是整数相除,结果仍是整数,余数会被扔掉,这种除法叫“地板除”
>>> 10 / 3
3
>>> 10.0 / 3
3.3333333333333335

>>> from __future__ import division # 导入后除法将变为精确除法
>>> 10 / 3
3.3333333333333335
1
2
3
4
5
# Python 3.x中,所有的除法都是精确除法,地板除用//表示
>>> 10 / 3
3.3333333333333335
>>> 10 // 3
3

unicode_literals

python2.7示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> type('hello world')
<type 'str'>
>>> type(b'hello world')
<type 'str'>
>>> type(u'hello world')
<type 'unicode'>

# python3 默认字符编码为 unicode, 类型为 str
>>> from __future__ import unicode_literals
>>> type('hello world')
<type 'unicode'>
>>> type(b'hello world')
<type 'str'>
>>> type(u'hello world')
<type 'unicode'>

python3.7示例:

1
2
3
4
5
6
>>> type('hello world')	      
<class 'str'>
>>> type(b'hello world')
<class 'bytes'>
>>> type(u'hello world')
<class 'str'>

注:如果你是python2.X版本,在导入新的功能特性后,就应该按照新功能的特性进行编写。

absolute_import

加入绝对引入新特性

-------------本文结束感谢您的阅读-------------