从字面意思,可以清晰的知道这个函数的作用是绝对路径导入,反之对应的就是相对路径。
绝对导入和相对导入之间的差异仅在从包导入模块和从包导入其他子模块时才起作用。拿下面的e.g.来说,在pkg下面有一个string.py
文件,与python标准库中的string模块同名
,里面的main.py
文件有引用string模块
,当我们从pkg包
开始导入main.py
的时候,如果没有absolute_import
,就会引用pkg
下的string模块
,反之,就会从顶层路径查找string标准库
。
liang@iZ250k0mjlbZ:~$ mkdir pkg
liang@iZ250k0mjlbZ:~$ touch pkg/__init__.py
liang@iZ250k0mjlbZ:~$ touch pkg/string.py
liang@iZ250k0mjlbZ:~$ echo 'import string;print(string.ascii_uppercase)' > pkg/main1.py
liang@iZ250k0mjlbZ:~$ python
Python 2.7.12 (default, Dec 4 2017, 14:50:18)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pkg.main1.py
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pkg/main1.py", line 1, in <module>
import string;print(string.ascii_uppercase)
AttributeError: 'module' object has no attribute 'ascii_uppercase'
>>> import pkg.main1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pkg/main1.py", line 1, in <module>
import string;print(string.ascii_uppercase)
AttributeError: 'module' object has no attribute 'ascii_uppercase'
>>> import pkg.string
>>> exit()
liang@iZ250k0mjlbZ:~$ echo 'from __future__ import absolute_import;import string;print(string.ascii_uppercase)' > pkg/main2.py
liang@iZ250k0mjlbZ:~$ python
Python 2.7.12 (default, Dec 4 2017, 14:50:18)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pkg.main2
ABCDEFGHIJKLMNOPQRSTUVWXYZ
>>> exit()
unicode_literals 作用
字面意思,可以简单的看出是针对于unicode编码
的,这个就涉及到python的编码历史问题了,python2默认是ascii编码,对于unicode编码
的字符串,必须在签名添加u
,e.g. u"测试",在python3解决了这个令人头疼的问题,默认编码采用了unicode编码
,此库的作用就是为了python2向python3过渡,一旦引入,当前文件下的编码默认就是unicode
,下面的例子直接展示了它的用途:
Python 2.7.12 (default, Dec 4 2017, 14:50:18)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from __future__ import unicode_literals
>>> a=u"aaa"
>>> a
u'aaa'
>>> a="aaa"
>>> a
u'aaa'
>>>