博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
谈谈python的from __future__ import absolute_import
阅读量:6953 次
发布时间:2019-06-27

本文共 1331 字,大约阅读时间需要 4 分钟。

hot3.png

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

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 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,在包外面加入口文件,推荐此方法。

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

你可能感兴趣的文章
.NET中lock的使用方法及注意事项[转]
查看>>
初级程序员面试不靠谱指南(六)
查看>>
初级程序员面试不靠谱指南(三)
查看>>
[Synology] [群晖] 关闭被占用的文件
查看>>
Configure Monit on AWS CentOS7 to guard Squid proxy
查看>>
NetBeans 默认编码修改方法
查看>>
Java基本概念(1)什么是Java
查看>>
jquery中prop()方法和attr()方法的区别
查看>>
selecter模块默认使用epoll 实现IO多路复用,展示单线程的并发效果
查看>>
Fall 2018 IS542 Final
查看>>
PHP下载压缩包文件
查看>>
【idea】Springboot整合jpa
查看>>
Android之开发杂记(三)
查看>>
Struts2之param标签的使用
查看>>
bzoj1497(最小割)
查看>>
【转】C#中将JSon数据转换成实体类,将实体类转换成Json
查看>>
在windows上使用ssh秘钥连接git服务器
查看>>
STL 之容器适配器
查看>>
Redis集群master选举时长测试
查看>>
linux IPC对象的持续性的说明
查看>>