详解Python中的from..import绝对导入语句


Posted in Python onJune 21, 2016

相对或者绝对import
更多的复杂部分已经从python2.5以来实现:导入一个模块可以指定使用绝对或者包相对的导入。这个计划将移动到使绝对的导入成为默认的细节在其他版本的python中。
我们假设你有一个包目录,像下面这样:

pkg/
pkg/__init__.py
pkg/main.py
pkg/string.py

上面定义了一个包称为 pkg 包含 pkg.main 和pkg.string 两个子模块。考虑在‘main.py'中的代码,什么事情会发生如果我们执行语句 import string 在python2.4或者更早的版本?他将会查询包的目录执行一个相对的import,找到pkg/string.py ,导入文件的内容作为pkg.string模块,这个模块的边界的名字是'string'在pkg.main模块中的名称空间。
如果pkg.string是你想要的这个非常不错。但是如果你仅仅想要的是python的基本的string模块?
没有清楚的方法忽略pkg.string以及寻找基本的模块;一般情况下你不得不去查看sys.modules中的内容,那有一点稍微的不清楚。Holger Krekel的py.std包提供了一个整齐的方法执行从基本库中导入的方法,improt py;py.std.string.jion(),但是那个包在python的安装过程是是不可用的。

阅读代码在相对导入方面也是不够清晰的,因为读者可能混淆string和pkg.string模块使用。Python用户可以马上知道那是不同的名称在基本库和自己的包模块之间,但是你不能保护你自己的子模块名字在一个新版本的python中。

从python2.5,你可以打开 import的行为直接去绝对导入使用一个 from __future__ import absolute_import 。这个绝对导入行为将成为一个默认的细节在将来的python中。一旦绝对导入被默认,import string 将总是寻找基本库。建议用户尽可能多的使用绝对导入,因此在你的代码中使用from pkg improt string是适宜的。在python2.*版本中需要:

from __future__ import absolute_import

示例1:
例如:在模块A.B.C中的代码:

from . import D     # 导入A.B.D
from .. import E    # 导入A.E
from ..F import G    # 导入A.F.G,.. 和 F是连着的,中间没有空格

.代表当前目录,..代表上一层目录,...代表上上层目录。

示例2:

目录结构:

package/
 __init__.py
 subpackage1/
  __init__.py
  moduleX.py
  moduleY.py
 subpackage2/
  __init__.py
  moduleZ.py
 moduleA.py

在subpackage1/moduleX.py 或者 subpackage1/__init__.py中可以这样导入module:

from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
from ...package import bar
from ...sys import path

注意,from ...sys import path是合法的,但是不建议。直接from sys import path就行了。

Python 相关文章推荐
python通过get,post方式发送http请求和接收http响应的方法
May 26 Python
python实现对excel进行数据剔除操作实例
Dec 07 Python
Python读取Word(.docx)正文信息的方法
Mar 15 Python
利用python实现对web服务器的目录探测的方法
Feb 26 Python
Python控制Firefox方法总结
Jun 03 Python
Python matplotlib学习笔记之坐标轴范围
Jun 28 Python
python retrying模块的使用方法详解
Sep 25 Python
基于python实现上传文件到OSS代码实例
May 09 Python
django创建css文件夹的具体方法
Jul 31 Python
Pygame框架实现飞机大战
Aug 07 Python
基于OpenCV的网络实时视频流传输的实现
Nov 15 Python
python代码实现备忘录案例讲解
Jul 26 Python
Java多线程编程中ThreadLocal类的用法及深入
Jun 21 #Python
深入解析Python中的__builtins__内建对象
Jun 21 #Python
浅谈Python中函数的参数传递
Jun 21 #Python
对比Python中__getattr__和 __getattribute__获取属性的用法
Jun 21 #Python
常见python正则用法的简单实例
Jun 21 #Python
小议Python中自定义函数的可变参数的使用及注意点
Jun 21 #Python
简单讲解Python编程中namedtuple类的用法
Jun 21 #Python
You might like
BBS(php & mysql)完整版(二)
2006/10/09 PHP
PHP访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
php模拟post行为代码总结(POST方式不是绝对安全)
2012/02/22 PHP
javascript编程起步(第二课)
2007/01/10 Javascript
extJs 常用到的增,删,改,查操作代码
2009/12/28 Javascript
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
jquery post方式传递多个参数值后台以数组的方式进行接收
2013/01/11 Javascript
调用HttpHanlder的几种返回方式小结
2013/12/20 Javascript
JQuery对表格进行操作的常用技巧总结
2014/04/23 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
Bootstrap实现input控件失去焦点时验证
2016/08/04 Javascript
详谈js遍历集合(Array,Map,Set)
2017/04/06 Javascript
详解Node.js项目APM监控之New Relic
2017/05/12 Javascript
seajs模块压缩问题与解决方法实例分析
2017/10/10 Javascript
vue脚手架及vue-router基本使用
2018/04/09 Javascript
详解ES6 Fetch API HTTP请求实用指南
2018/11/14 Javascript
javascript实现小型区块链功能
2019/04/03 Javascript
刷新页面后让控制台的js代码继续执行
2019/09/20 Javascript
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
Python实现 版本号对比功能的实例代码
2019/04/18 Python
django queryset相加和筛选教程
2020/05/18 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
2020/07/01 Python
伦敦平价潮流珠宝首饰品牌:Astrid & Miyu
2016/10/10 全球购物
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
生日宴会答谢词
2014/01/09 职场文书
2014年文学毕业生自我鉴定
2014/04/23 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
报表员工作失误检讨书范文
2014/09/19 职场文书
婚内分居协议书范文
2014/11/26 职场文书
工作简历自我评价
2015/03/11 职场文书
欧也妮葛朗台读书笔记
2015/06/30 职场文书
体育部部长竞选稿
2015/11/21 职场文书
对讲机的最大通讯距离是多少
2022/02/18 无线电
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技
如何使用注解方式实现 Redis 分布式锁
2022/07/23 Redis