__future__
模块的作用
__future__
模块用于在当前版本py编译器中引入更高版本py的功能- 该语句必须写在首行
- Python2.1之后的版本才支持该模块
python每个版本都会做一些改进,并且大多不是向后兼容的,这时候就需要修改旧代码使其符合新Python版本要求。但是如果整个项目的代码都做迁移是非常麻烦的事情。当需要使用新版本的某些特性时,我们不妨在原有代码的基础上引入该特性,这样就能降低代码的改动量,这时就需要用到__future__
模块,它支持在旧的Python中引入更新版本的功能。所以从某种意义上来说,Python是一门向后兼容的语言。
使用方式
from __future__ import xxx
print_function
在py2中,print并不是一个函数,使用它是不需要加括号的。
但在py3中,print是一个函数,调用方式跟一般的py函数一致,需要加括号
print 'error'
------------
OUT:
File "<ipython-input-2-58dc6da12e84>", line 1
print 'error'
^
SyntaxError: Missing parentheses in call to 'print'
如果要让py2中的print也需要加括号,那么就需要写入如下语句,引入py3中的print_function
from __future__ import print_function
absolute_import
首先我们假定你的Python项目结构如下:
pak/
pak/main.py
pak/str.py
pak/mystr.py
pak/xml.py
包引用的三种格式
absolute_import
如果你在main.py文件中写入如下调用:from pak import str import pak.str import mystr
一般都是绝对引用,因为你的包名pak一般来说不会有冲突
relative import
如果是这样:import str import xml import mystr
就看不出来包的隶属关系,如果你的py环境是2.4或者之前的版本,那么它是首先从当前脚本main.py所在文件夹下搜索是否有str,xml,mystr之类的包的,这样就会跟py系统自带的str,xml包冲突,从而将其覆盖。
在2.5,2.6版本中,可以使用from __future__ import absolute_import
来解决该问题,也就是从更高Python版本中引入绝对引用,从而强制默认绝对引用。
2.7以后的版本都是默认绝对引用。显式相对引用
from . import str from . import xml from . import mystr
如果懒得像绝对引用那样写出包名,有要避免引用的包覆盖系统默认包,可以如上述写法。如果有多级文件夹,那么就多几个点,但一般而言不建议二级以上的点,也就是到
from .. import xxx
就差不多了,再多加几个点就很影响代码可读性了。