python的__future__模块
作用
__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']
对应功能如下
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
print_function 新的print是一个函数,如果导入此特性,之前的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
unicode_literals 这个是对字符串使用unicode字符
In [1]: print '目录' 鐩綍 In [2]: from __future__ import unicode_literals In [3]: print '目录' 目录
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
nested_scopes 这个是修改嵌套函数或lambda函数中变量的搜索顺序,从`当前函数命名空间->模块命名空间`的顺序更改为了`当前函数命名空间->父函数命名空间->模块命名空间`,python2.7.5中默认使用
generators 生成器,对应yield的语法,python2.7.5中默认使用
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