from __future__ import absolute_import用法心得小结

这是一个在py2.x中导入3.x的导入特性的语句, 是为了区分出绝对导入和相对导入.

在一般的Python学习资料中介绍3.x的相对导入时候一般都会说相对导入最后不要超过两层.

但是需要区分出我们编写的代码是干嘛的,如果是写的应用程序,在加入了from __future__ import absolute_import 之后,那么在程序的编写过程中使用类似from package.submodule import b 只能导入系统环境路径里面的包,导入不了你写的应用程序的子包,如果导入你写的应用程序的子包必须使用from ..submodule import b

如果写的是工具类程序,比如说写的是三方包,发布给别人安装。那么在加入了from __future__ import absolute_import 之后还是可以在相对导入的时候使用from package.submodule import b 。那么这么做不是from __future__ import absolute_import 所说的特性没有了么。其实不然。因为我们编写的程序是需要安装在系统环境路径里面的,所以这种绝对导入的方式是可以相对导入的,这个时候搜索包名的时候是在系统环境路径里面搜索,但是因为你的包就在这些路径的某一个路径里面,所以可以搜得到from package.submodule import b 里面的b(模块,函数,变量,类)。这种编写工具包以绝对导入进行相对导入的方法还避免了from ..submodule import b 最好导入不超过两层的这一建议. 特别适合在开发大型工具的时候。比如著名的深度学习框架tensorflow就是用的这种特性.

下面是截取tensorflow.contrib.__init__.py里面的代码

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

# Add projects here, they will show up under tf.contrib.
from tensorflow.contrib import bayesflow
from tensorflow.contrib import copy_graph
from tensorflow.contrib import crf
from tensorflow.contrib import cudnn_rnn
from tensorflow.contrib import distributions
from tensorflow.contrib import factorization
from tensorflow.contrib import framework
from tensorflow.contrib import graph_editor
from tensorflow.contrib import grid_rnn

你可能感兴趣的:(python)