本文章转载自:https://www.cnblogs.com/ksedz/p/3190208.html
作用
future__模块提供某些将要引入的特性
2.7.5的__future
基本上是python3中的特性
有以下内容
In [1]: import __future__
In [2]: __future__.
__future__.CO_FUTURE_ABSOLUTE_IMPORT __future__.all_feature_names
__future__.CO_FUTURE_DIVISION __future__.division
__future__.CO_FUTURE_PRINT_FUNCTION __future__.generators
__future__.CO_FUTURE_UNICODE_LITERALS __future__.nested_scopes
__future__.CO_FUTURE_WITH_STATEMENT __future__.print_function
__future__.CO_GENERATOR_ALLOWED __future__.unicode_literals
__future__.CO_NESTED __future__.with_statement
__future__.absolute_import
In [2]: __future__.
可导入的功能有哪些?
In [3]: import __future__
In [4]: __future__.all_feature_names
Out[4]:
['nested_scopes',
'generators',
'division',
'absolute_import',
'with_statement',
'print_function',
'unicode_literals']
对应功能如下:
[1] division 新的除法特性,本来的除号/
对于分子分母是整数的情况会取整,但新特性中在此情况下的除法不会取整,取整的使用//
。如下可见,只有分子分母都是整数时结果不同。
In [1]: 3 / 5
Out[1]: 0
In [2]: 3 // 5
Out[2]: 0
In [3]: 3.0 / 5.0
Out[3]: 0.6
In [4]: 3.0 // 5.0
Out[4]: 0.0
In [5]: from __future__ import division
In [6]: 3 / 5
Out[6]: 0.6
In [7]: 3 // 5
Out[7]: 0
In [8]: 3.0 / 5.0
Out[8]: 0.6
In [9]: 3.0 // 5.0
Out[9]: 0.0
[2] print_function 新的print是一个函数,如果导入此特性,之前的print语句就不能用了。在python2.x中print函数无需括号,但在python3.x中需要括号;在代码中导入print_function后,再写print必须加括号。
In [1]: print 'test __future__'
test __future__
In [2]: from __future__ import print_function
In [3]: print('test')
test
In [4]: print 'test'
File "<ipython-input-4-ed4b06bfff9f>", line 1
print 'test'
^
SyntaxError: invalid syntax
[3] unicode_literals 这个是对字符串使用unicode字符。
In [1]: print '目录'
鐩綍
In [2]: from __future__ import unicode_literals
In [3]: print '目录'
目录
[4] absolute_import 这个没有搞懂,如果我当前目录有一个sys.py,我用的时候总是会调用系统的sys。如果当前目录和sys.path的路径中都有一个foo,则都会调用当前目录下的foo。另外,我运行的方式都是 python filename.py的方式,而如果使用python -c "import filename"则又是另一种答案。这个问题还没有解决,搜到的最详细的讨论见http://bytes.com/topic/python/answers/596703-future-import-absolute_import
[5] nested_scopes 这个是修改嵌套函数或lambda函数中变量的搜索顺序,从当前函数命名空间->模块命名空间
的顺序更改为了当前函数命名空间->父函数命名空间->模块命名空间
,python2.7.5中默认使用
[6] generators 生成器,对应yield的语法,python2.7.5中默认使用
[7] with_statement 是使用with关键字,python2.7.5是默认使用
运用
首先是可以做个性化的用法,比如你喜欢用print()而不是print
更重要的是基本用以下几句就可以让python2和python3有良好的兼容性了
from __future__ import print_function
from __future__ import unicode_literals
from __future__ import division
from __future__ import absolute_import