绝对导入与相对导入、__future__模块的absolute_import、division和print_function

版权声明:站在巨人的肩膀上学习。 https://blog.csdn.net/zgcr654321/article/details/83687439

绝对导入与相对导入:

相对导入:

relative import也叫作相对引入,在Python2.5及之前是默认的引入方法。

类似上面的写法就是相对导入。这种引入方式使用一个点号来标识引入类库的精确位置。与linux的相对路径表示相似,一个点表示当前目录,每多一个点号则代表向上一层目录

如:

这个例子用from .foo import a即从foo.py的上一级目录中查找名为a的包然后导入。

绝对导入:

absolute import 也叫作绝对引入,在Python2.5被完全实现。但是需要通过 from __future__ import absolute_import 来打开该引入进制在Python2.6之后以及Python3,完全引用成为Python的默认的引入机制

注意:

Python解释器会自动将当前工作目录添加到PYTHONPATH这样我们的sys.path(系统环境路径)中就会包含当前工作目录

在绝对导入中,我们必须从包目录最顶层目录依次写下一直到我们要导入的最终那个子包,而不能从中间开始。Python解释器会从sys.path中的目录中查找我们绝对引入的包的最顶层目录,然后依次向下找到我们最终要导入的那个子包

如:

Python解释器会自动将当前工作目录添加到PYTHONPATH。因此执行的时候,我们可以让解释器自动的将类库的目录添加到PYTHONPATH中。

如下面,我们cat run_ex3.py后,再使用绝对导入,就可以正确执行ex3下的main.py文件。

综合举例:

假如一个包结构是这样的:

pkg/ 
pkg/init.py 
pkg/main.py 
pkg/string.py

此时,如果你在main.py中写import string,那么在Python 2.4或之前, Python会先查找当前目录下有没有string.py, 若找到了,则引入该模块,然后你在main.py中可以直接用string了。注意这时候用的是同目录下的string.py。

如果你是想用系统自带的标准string.py呢?这时候你就需要from __future__ import absolute_import了。这样你就可以用import string来引入系统的标准string.py, 而用from pkg import string来引入当前目录下的string.py了

absolute_import:

用法:

from __future__ import absolute_import

这是一个在python3.0 以前的旧版本中启用相对导入等特性所必须的 future 语句, 是为了区分出绝对导入和相对导入。

加入from __future__ import absolute_import 之后,那么在程序的编写过程中使用类似from package.submodule import b 后导入包b只会从系统环境路径中寻找package.submodule,然后导入其中的包b。

division:

在python2.x版本中导入python3.0支持的语言特征division(精确除法),当我们没有在程序中导入该特征时,"/"操作符执行的是截断除法(Truncating Division),当我们导入精确除法之后,"/"执行的是精确除法。

如:

>>> 3/4
0
>>> from __future__ import division
>>> 3/4
0.75

# 导入精确除法后,若要执行截断除法,可以使用"//"操作符:

>>> 3//4
0
>>> 

print_function:

使用from __future__ import print_function后,在python2.X中导入python3.0支持的print语句的特征,这时再使用print就得像python3.X那样加括号使用。python2.X中print不需要括号,而在python3.X中则需要。

如:

# python2.7
print "Hello world"

# python3
print("Hello world")

猜你喜欢

转载自blog.csdn.net/zgcr654321/article/details/83687439