Python 中的

Python 中的 __future__ 模块介绍

__future__模块是什么

__future__模块是什么

随着Python3的普及,现在还在使用Python2版本的同学为了避免当前版本运行正常的代码,在升级至Python3版本后运行可能出现异常的现象发生,大多会使用"from __future__ import FeatureName",使得在旧的Python版本中能够兼顾未来版本的新特性。

也就是说,如果某个版本中出现了新的功能特性,并且这个新特性和当前版本中不兼容(在该版本中不符合语言标准),那么想要使用的话就需要从__future__模块中导入了。

阅读__future__.py模块代码,不难得出如下信息:

(1)自python2.1起, 当一个新的语言特性首次出现在发行版中, 如果该新特性与旧版本python不兼容, 则该特性将会被默认禁止调用。如果想调用这个新特性, 则必须使用 “from __future__ import FeatureName”进行导入。

(2)future__模块主要作用是提供某些将要引入的模块(当前版本不存在),而import则是引入已经在该版本发布的模块。如,python3版本之前print并不是一个函数。

print_function = _Feature((2, 6, 0, "alpha", 2), 

(3, 0, 0, "alpha", 0),
CO_FUTURE_PRINT_FUNCTION)

(3)_future__这个模块在2.1版本时才存在,若在此版本之前导入将产生异常。同时,当环境升级至以后的某个版本中,某个特性已经成为标准的一部分,那么使用该特性就不用从__future__导入了。

nested_scopes = _Feature((2, 1, 0, "beta", 1),
(2, 2, 0, "alpha", 0),
CO_NESTED)

(4)避免因为版本的更新,导致原有可正常运行的代码,出现异常。比如下面这行代码在python2.7中可以运行,但在python3.0中会异常。

print ‘xiaowukongqimotuo’

(5)from __future__ import FeatureName 必须在文件的开头引用,否则会触发SyntaxError异常

Python 中的 __future__ 模块介绍

__future__模块包含哪些新特性

__future__模块包含哪些新特性

Python 中的 __future__ 模块介绍

__future__.py部分源码截图

通过__future__.py模块可以看到,python2可以使用python3的哪些新特性:

unicode_literals、division、print_function、absolute_import

unicode_literals

  • Python 2有两种字符串类型:Unicode字符串和非Unicode字符串,字符串是以beytes方式存储的。
  • Python 3只有一种类型:Unicode字符串,字符串是以unicode方式存储的

在python2 中导入python3支持的unicode_literals特性后,s = '小悟空骑摩托,默认就是Unicode方式存储的,这对应了Python2 的s = u'小悟空骑摩托'。

Python 中的 __future__ 模块介绍

输出:

Python 中的 __future__ 模块介绍

同时需要了解的是,对于str类型的字符串,调用len()和遍历时,是以字节为单位的,使得相同字符的不同的编码格式,长度往往是不同的。对unicode类型的字符串调用len()和遍历是以字符为单位,这其实是我们所期望的。

division(精确除法)

在python2 中导入python3支持的division特性后,即from __future__ import division ,"/"执行的是精确除法,"//"执行的是整除。当我们在程序中没有导入该特征时,"/"操作符执行的只能是整除(取整)。

Python 中的 __future__ 模块介绍

输出:

Python 中的 __future__ 模块介绍

print_function

在python2 中导入python3支持的print_function特性后,新的print是一个函数。如果导入此特性,之前的print xxx语句就不能用了,会抛SyntaxError异常。

Python 中的 __future__ 模块介绍

输出

Python 中的 __future__ 模块介绍

absolute_import(拒绝隐式引用,绝对导入)

比如当我们面临如下目录结构时,
-Toutiao/
--Toutiao/init.py
--Toutiao/future.py
--Toutiao/string.py

如果你在future.py中写import string,那么在Python 2.4或之前(相对导入), Python会先查找Toutiao目录下有没有string.py, 若找到了,则直接引入该模块。如果此时真正的意图是想使用系统标准的string.py呢?这时候就需要"from __future__ import absolute_import"了。这样,就可以用import string来引入

系统环境路径里的标准string.py模块,而用from Toutiao import string来引入Toutiao目录下的string.py了。


分享到:


相關文章: