谈谈python的from __future__ import absolute_import

平时在看开源项目的时候,我们会去发现包文件在最开头有下面这句话

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如下结果:

120219_jl5f_1020513.png

如果在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 math
import math

def 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.pi

if __name__ == '__main__':
    print(run())

这是因为显示相对引用只能用在package中,而不能在有main函数的模块里面使用。所以显示相对引用和main不能共存。

解决方法:

    1,改为隐式引用。最简单,但是也违背了避免意外包函数变量覆盖的隐患。

    2,在包外面加入口文件,推荐此方法。

转载于:https://my.oschina.net/xiaopei/blog/877165

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值