平时在看开源项目的时候,我们会去发现包文件在最开头有下面这句话
from __future__ import absolute_import
想说下这个问题,是新人在写代码的时候发现加不加好像没啥区别啊。显示相对引用反而不好用啊,没法在包内写“if __name__ == '__main__'来调试不方便啊。”
这个单词很简单,可以望文生义或者字面意思是仅让使用“绝对引用”,但并不是这样的
而是拒绝使用“ implicit relative import” ,并不拒绝“explicit relative import. ”其实这个“absolute_import”改为“noimplicit_import”应该更为好理解。以后再见到这个东西,直接理解为拒绝隐式引用即可。
1,先从一个简单例子来说下
文件目录如下:
|-- p1
| |-- __init__.py | |-- area.py | `-- math.py |-- p2 | `-- bulk.py `-- test.py在P1目录,math文件只有一个常量pi=3.14。在area里面引用math
(1)import math #python2已经不推荐使用,py3已经不能使用了。
分别执行test.py如下结果:
如果在py3也想使用3.14,把area的math引入换成“from . import math”即可。但是如何让import math在py2里面使用标准库的3.14159265359呢,就是标题所说的,加上“from __future__ import absolute_import”。代码:
#!/usr/bin/env python#-*- coding:utf-8 -*-from __future__ import absolute_import#from . import mathimport mathdef run(): return math.pi
(2)from . import math #大家都这么用
(3)from p1 import math #官方推荐方式
2,包内测试常碰到的问题。
python里面大家如果想测试一个函数,最简单的是在当前文件加上 __name__ == "__main__"来进行代码调试。但是当我们使用显示相对引用,这样代码就没法正常运行。会报错“ValueError: Attempted relative import in non-package”。如下代码:
from . import math #引用包内的一个文件def run(): return math.piif __name__ == '__main__': print(run())
这是因为显示相对引用只能用在package中,而不能在有main函数的模块里面使用。所以显示相对引用和main不能共存。
解决方法:
1,改为隐式引用。最简单,但是也违背了避免意外包函数变量覆盖的隐患。
2,在包外面加入口文件,推荐此方法。